460 Stimmen

Wie kann ich XML in C# erstellen?

Wie kann ich in C# gültiges XML generieren?

525voto

Marc Gravell Punkte 970173

Das hängt vom jeweiligen Szenario ab. XmlSerializer ist sicherlich eine Möglichkeit und hat den Vorteil, dass sie direkt auf ein Objektmodell abgebildet wird. In .NET 3.5, XDocument usw. sind ebenfalls sehr freundlich. Wenn die Größe sehr groß ist, dann XmlWriter ist Ihr Freund.

Für ein XDocument Beispiel:

Console.WriteLine(
    new XElement("Foo",
        new XAttribute("Bar", "some & value"),
        new XElement("Nested", "data")));

Oder dasselbe mit XmlDocument :

XmlDocument doc = new XmlDocument();
XmlElement el = (XmlElement)doc.AppendChild(doc.CreateElement("Foo"));
el.SetAttribute("Bar", "some & value");
el.AppendChild(doc.CreateElement("Nested")).InnerText = "data";
Console.WriteLine(doc.OuterXml);

Wenn Sie eine groß Datenstroms, dann ist jeder der DOM-Ansätze (wie XmlDocument / XDocument usw.) wird schnell viel Speicherplatz beanspruchen. Wenn Sie also eine 100 MB große XML-Datei von CSV könnten Sie Folgendes in Betracht ziehen XmlWriter Dies ist primitiver (ein einmaliger Schreibvorgang), aber sehr effizient (stellen Sie sich hier eine große Schleife vor):

XmlWriter writer = XmlWriter.Create(Console.Out);
writer.WriteStartElement("Foo");
writer.WriteAttributeString("Bar", "Some & value");
writer.WriteElementString("Nested", "data");
writer.WriteEndElement();

Schließlich, über XmlSerializer :

[Serializable]
public class Foo
{
    [XmlAttribute]
    public string Bar { get; set; }
    public string Nested { get; set; }
}
...
Foo foo = new Foo
{
    Bar = "some & value",
    Nested = "data"
};
new XmlSerializer(typeof(Foo)).Serialize(Console.Out, foo);

Dies ist ein gutes Modell für die Zuordnung zu Klassen usw.; es könnte jedoch zu viel sein, wenn Sie etwas Einfaches machen (oder wenn die gewünschte XML-Datei nicht wirklich eine direkte Beziehung zum Objektmodell hat). Ein weiteres Problem mit XmlSerializer ist, dass es keine unveränderlichen Typen serialisieren möchte: alles muss einen öffentlichen Getter haben y Setter (es sei denn, Sie machen das alles selbst, indem Sie die IXmlSerializable in diesem Fall haben Sie nicht viel gewonnen, wenn Sie XmlSerializer ).

61voto

Das Beste, was ich ausprobiert habe, ist zweifellos LINQ zu XSD (was den meisten Entwicklern unbekannt ist). Sie geben ihm ein XSD-Schema und es generiert für Sie im Hintergrund ein perfekt abgebildetes, vollständiges, stark typisiertes Objektmodell (basierend auf LINQ to XML), mit dem es wirklich einfach zu arbeiten ist - und es aktualisiert und validiert Ihr Objektmodell und XML in Echtzeit. Obwohl es sich noch um eine "Vorschau" handelt, habe ich noch keine Bugs entdeckt.

Wenn Sie ein XSD-Schema haben, das wie folgt aussieht:

  <xs:element name="RootElement">
     <xs:complexType>
      <xs:sequence>
        <xs:element name="Element1" type="xs:string" />
        <xs:element name="Element2" type="xs:string" />
      </xs:sequence>
       <xs:attribute name="Attribute1" type="xs:integer" use="optional" />
       <xs:attribute name="Attribute2" type="xs:boolean" use="required" />
     </xs:complexType>
  </xs:element>

Dann können Sie XML einfach wie folgt aufbauen:

RootElement rootElement = new RootElement;
rootElement.Element1 = "Element1";
rootElement.Element2 = "Element2";
rootElement.Attribute1 = 5;
rootElement.Attribute2 = true;

Oder laden Sie einfach ein XML aus einer Datei wie dieser:

RootElement rootElement = RootElement.Load(filePath);

Oder speichern Sie es so:

rootElement.Save(string);
rootElement.Save(textWriter);
rootElement.Save(xmlWriter);

rootElement.Untyped liefert auch das Element in Form eines XElements (von LINQ to XML).

24voto

Vincent Punkte 1
new XElement("Foo",
       from s in nameValuePairList
       select
             new XElement("Bar",
                  new XAttribute("SomeAttr", "SomeAttrValue"),
                          new XElement("Name", s.Name),
                          new XElement("Value", s.Value)
                         )
            );

10voto

XmlWriter ist der schnellste Weg, um gutes XML zu schreiben. XDocument, XMLDocument und einige andere funktionieren ebenfalls gut, sind aber nicht für das Schreiben von XML optimiert. Wenn Sie XML so schnell wie möglich schreiben wollen, sollten Sie unbedingt XmlWriter verwenden.

5voto

Bob Punkte 93584

In der Vergangenheit habe ich mein XML-Schema erstellt und dann ein Tool verwendet, um C#-Klassen zu generieren, die sich mit diesem Schema serialisieren lassen. Das XML Schema Definition Tool ist ein Beispiel dafür

http://msdn.microsoft.com/en-us/library/x6c1kb0s(VS.71).aspx

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X