Wie kann ich in C# gültiges XML generieren?
Antworten
Zu viele Anzeigen?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
).
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).
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
- See previous answers
- Weitere Antworten anzeigen