Was ist der beste Weg, um mit XML-Dokumenten, XSD usw. in C # 2.0 umzugehen?
Welche Klassen werden verwendet? Usw. Was sind die Best Practices für das Parsen und Erstellen von XML-Dokumenten usw.
EDIT: .Net 3.5 Vorschläge sind ebenfalls willkommen.
Antworten:
Das primäre Mittel zum Lesen und Schreiben in C # 2.0 erfolgt über die XmlDocument- Klasse. Sie können die meisten Ihrer Einstellungen über den akzeptierten XmlReader direkt in das XmlDocument laden.
XML direkt laden
Laden von XML aus einer Datei
Ich finde, der einfachste / schnellste Weg, ein XML-Dokument zu lesen, ist die Verwendung von XPath.
Lesen eines XML-Dokuments mit XPath (Verwenden von XmlDocument, mit dem wir es bearbeiten können)
Wenn Sie mit XSD-Dokumenten arbeiten müssen, um ein XML-Dokument zu validieren, können Sie dies verwenden.
Validieren von XML-Dokumenten anhand von XSD-Schemas
Validierung von XML gegen XSD an jedem Knoten (UPDATE 1)
Schreiben eines XML-Dokuments (manuell)
(UPDATE 1)
In .NET 3.5 verwenden Sie XDocument, um ähnliche Aufgaben auszuführen. Der Unterschied besteht jedoch darin, dass Sie den Vorteil haben, Linq-Abfragen durchzuführen, um genau die Daten auszuwählen, die Sie benötigen. Durch Hinzufügen von Objektinitialisierern können Sie eine Abfrage erstellen, die sogar Objekte Ihrer eigenen Definition direkt in der Abfrage selbst zurückgibt.
(UPDATE 2)
Eine gute Möglichkeit in .NET 3.5 ist die Verwendung von XDocument zum Erstellen von XML. Dadurch erscheint der Code in einem ähnlichen Muster wie die gewünschte Ausgabe.
schafft
Alles andere schlägt fehl. Sie können diesen MSDN-Artikel lesen, der viele Beispiele enthält, die ich hier und mehr besprochen habe. http://msdn.microsoft.com/en-us/library/aa468556.aspx
quelle
Es hängt von der Größe ab; Für kleine bis mittelgroße XML- Dateien ist ein DOM wie XmlDocument (beliebige C # /. NET-Versionen) oder XDocument (.NET 3.5 / C # 3.0) der offensichtliche Gewinner. Für die Verwendung von xsd können Sie xml mit einem XmlReader laden , und ein XmlReader akzeptiert (zum Erstellen ) XmlReaderSettings . Die XmlReaderSettings-Objekte verfügen über eine Schemas- Eigenschaft, mit der eine xsd- (oder dtd-) Validierung durchgeführt werden kann.
Für das Schreiben von XML gelten dieselben Dinge, wobei zu beachten ist, dass das Layouten von Inhalten mit LINQ-to-XML (XDocument) etwas einfacher ist als mit dem älteren XmlDocument.
Bei großen XML-Dateien kann ein DOM jedoch zu viel Speicherplatz beanspruchen. In diesem Fall müssen Sie möglicherweise XmlReader / XmlWriter direkt verwenden.
Schließlich möchten Sie zum Bearbeiten von XML möglicherweise XslCompiledTransform (eine xslt-Ebene) verwenden.
Die Alternative zur Arbeit mit XML besteht darin, mit einem Objektmodell zu arbeiten. Mit xsd.exe können Sie Klassen erstellen, die ein xsd-kompatibles Modell darstellen. Laden Sie die XML-Datei einfach als Objekte , bearbeiten Sie sie mit OO und serialisieren Sie diese Objekte erneut. Sie tun dies mit XmlSerializer .
quelle
Die Antwort von nyxtom ist sehr gut. Ich würde ein paar Dinge hinzufügen:
Wenn Sie schreibgeschützten Zugriff auf ein XML-Dokument benötigen,
XPathDocument
ist dies ein viel leichteres Objekt alsXmlDocument
.Der Nachteil der Verwendung
XPathDocument
ist, dass Sie nicht die bekanntenSelectNodes
undSelectSingleNode
Methoden von verwenden könnenXmlNode
. Stattdessen müssen Sie die folgenden Tools verwendenIXPathNavigable
: Verwenden SieCreateNavigator
zum Erstellen einesXPathNavigator
und verwenden Sie dasXPathNavigator
zum Erstellen vonXPathNodeIterator
s, um die über XPath gefundenen Knotenlisten zu durchlaufen. Dies erfordert im Allgemeinen einige Codezeilen mehr als dieXmlDocument
Methoden.Aber: Die Klassen
XmlDocument
undXmlNode
implementierenIXPathNavigable
, sodass jeder Code, den Sie schreiben, um diese Methoden auf einem zu verwendenXPathDocument
, auch auf einem funktioniertXmlDocument
. Wenn Sie sich daran gewöhnt haben, dagegen zu schreibenIXPathNavigable
, können Ihre Methoden gegen beide Objekte arbeiten. (Aus diesem Grund wird die Verwendung vonXmlNode
undXmlDocument
in Methodensignaturen von FxCop gekennzeichnet.)Bedauerlicherweise
XDocument
undXElement
(undXNode
undXObject
) nicht implementierenIXPathNavigable
.Eine andere Sache, die in Nyxtoms Antwort nicht vorhanden ist, ist
XmlReader
. Im AllgemeinenXmlReader
vermeiden Sie den Aufwand für das Parsen des XML-Streams in ein Objektmodell, bevor Sie mit der Verarbeitung beginnen. Stattdessen verwenden Sie aXmlReader
, um den Eingabestream jeweils für einen XML-Knoten zu verarbeiten. Dies ist im Wesentlichen die Antwort von .NET auf SAX. Sie können damit sehr schnellen Code für die Verarbeitung sehr großer XML-Dokumente schreiben.XmlReader
bietet auch die einfachste Möglichkeit, XML-Dokumentfragmente zu verarbeiten, z. B. den Stream von XML-Elementen ohne einschließendes Element, das von der FOR XML RAW-Option von SQL Server zurückgegeben wird.Der Code, mit dem Sie schreiben,
XmlReader
ist im Allgemeinen sehr eng an das Format des gelesenen XML gekoppelt. Durch die Verwendung von XPath kann Ihr Code viel, viel lockerer mit dem XML gekoppelt werden, weshalb dies im Allgemeinen die richtige Antwort ist. Aber wenn Sie es brauchen, brauchenXmlReader
Sie es wirklich.quelle
XPathNavigator CreateNavigator(this XNode node)
zum Erstellen einerXPathNavigator
ausXNode
(einschließlich der abgeleiteten KlasseXDocument
) gibt.Lernen Sie zunächst die neuen Klassen XDocument und XElement kennen , da sie eine Verbesserung gegenüber der vorherigen XmlDocument-Familie darstellen.
Jedoch , müssen Sie unter Umständen noch die alten Klassen zur Arbeit mit Legacy - Code verwenden - besonders zuvor generierten Proxies. In diesem Fall müssen Sie sich mit einigen Mustern für die Interaktion zwischen diesen XML-Verarbeitungsklassen vertraut machen.
Ich denke, Ihre Frage ist ziemlich weit gefasst und würde zu viel in einer einzigen Antwort erfordern, um Details anzugeben, aber dies ist die erste allgemeine Antwort, an die ich gedacht habe, und dient als Anfang.
quelle
101 Linq-Proben
http://msdn.microsoft.com/en-us/library/bb387098.aspx
und Linq to XML-Beispiele
http://msdn.microsoft.com/en-us/vbasic/bb688087.aspx
Und ich denke, Linq macht XML einfach.
quelle
Wenn Sie in .NET 3.5 arbeiten und keine Angst vor experimentellem Code haben, können Sie LINQ to XSD ( http://blogs.msdn.com/xmlteam/archive/2008/02/21/linq-to-) überprüfen. xsd-alpha-0-2.aspx ), das .NET-Klassen aus einer XSD generiert (einschließlich integrierter Regeln aus der XSD).
Es kann dann direkt in eine Datei schreiben und aus einer Datei lesen, um sicherzustellen, dass sie den XSD-Regeln entspricht.
Ich empfehle auf jeden Fall eine XSD für jedes XML-Dokument, mit dem Sie arbeiten:
Ich finde, dass Liquid XML Studio ein großartiges Tool zum Generieren von XSDs ist und kostenlos ist!
quelle
Wenn Sie im Designer ein typisiertes Dataset erstellen, erhalten Sie automatisch eine xsd, ein stark typisiertes Objekt, und können die XML mit einer Codezeile laden und speichern.
quelle
Meine persönliche Meinung als C # -Programmierer ist, dass der beste Weg, mit XML in C # umzugehen, darin besteht, diesen Teil des Codes an ein VB .NET-Projekt zu delegieren. In .NET 3.5 verfügt VB .NET über XML-Literale, die den Umgang mit XML wesentlich intuitiver machen. Siehe hier zum Beispiel:
Übersicht über LINQ to XML in Visual Basic
(Stellen Sie sicher, dass auf der Seite VB-Code und nicht C # -Code angezeigt wird.)
Ich würde den Rest des Projekts in C # schreiben, aber das XML in einem referenzierten VB-Projekt behandeln.
quelle
Schreiben von XML mit der XmlDocument-Klasse
quelle
Nyxtom,
Sollten "doc" und "xdoc" in Beispiel 1 nicht übereinstimmen?
quelle
Cookeys Antwort ist gut ... aber hier finden Sie detaillierte Anweisungen zum Erstellen eines stark typisierten Objekts aus einer XSD (oder XML) und zum Serialisieren / Deserialisieren in wenigen Codezeilen:
Anleitung
quelle
Wenn Sie jemals Daten zwischen
XmlNode
<=>XNode
<=> konvertieren müssenXElement
(z. B. um LINQ zu verwenden), können diese Erweiterungen für Sie hilfreich sein:
Verwendung:
quelle