Ok, ich habe das wieder geöffnet. Das Duplikat war eine XML Reader-Lösung, bei der es um das Parsen von XML-Dateien geht. Das mögliche Duplikat kann in den Fragen gesehen werden. Verlauf bearbeiten ps @GeorgeStocker
Jeremy Thompson
1
@JeremyThompson Einer der Gründe, warum dies ein Duplikat war, ist, dass die andere Frage eine viel bessere Antwort hat. Die Top-Antwort, die eine einfache "Nur Link" -Antwort ist, ist nicht nützlich.
George Stocker
1
@GeorgeStocker Die Fragen sind unterschiedlich genug, um nebeneinander zu existieren, und beide haben großartige Antworten. Außerdem akzeptieren die akzeptierten unterschiedliche Technologien. Aus diesem Grund habe ich dafür gestimmt, dass wir dies offen lassen. Ich weiß, dass dieses akzeptierte nur ein Link ist, aber es ist MSDN und wurde zu einem Zeitpunkt geschrieben, bevor dies nicht akzeptabel war. Hoffentlich macht ein Nebeneffekt der Wiedereröffnung Jon ein bisschen munter, lesen Sie sein Profil . Wie auch immer, Prost.
Es ist sehr einfach. Ich weiß, dass dies Standardmethoden sind, aber Sie können Ihre eigene Bibliothek erstellen, um damit viel besser umzugehen.
Hier sind einige Beispiele:
XmlDocument xmlDoc=newXmlDocument();// Create an XML document object
xmlDoc.Load("yourXMLFile.xml");// Load the XML document from the specified file// Get elementsXmlNodeList girlAddress = xmlDoc.GetElementsByTagName("gAddress");XmlNodeList girlAge = xmlDoc.GetElementsByTagName("gAge");XmlNodeList girlCellPhoneNumber = xmlDoc.GetElementsByTagName("gPhone");// Display the resultsConsole.WriteLine("Address: "+ girlAddress[0].InnerText);Console.WriteLine("Age: "+ girlAge[0].InnerText);Console.WriteLine("Phone Number: "+ girlCellPhoneNumber[0].InnerText);
Es gibt auch einige andere Methoden , mit denen Sie arbeiten können. Zum Beispiel hier . Und ich denke, es gibt keine beste Methode, um dies zu tun; Sie müssen es immer selbst auswählen, was für Sie am besten geeignet ist.
+1 für die Erwähnung von XmlDocument, das in einigen Fällen viel praktischer ist als Serialisierungsschnittstellen. Wenn Sie nach einem bestimmten Element suchen, können Sie mit dem Indexer auf untergeordnete Elemente zugreifen: xmlDoc ["Root"], und diese können verkettet werden: xmlDoc ["Root"] ["Folder"] ["Item"], um das zu durchsuchen Hierarchie (obwohl es sinnvoll ist zu überprüfen, ob diese Elemente tatsächlich existieren)
Jason Williams
1
InnerTextHier wird der Wert dieses Knotens abgerufen, der mit allen Werten der untergeordneten Knoten verknüpft ist - richtig? Scheint seltsam zu sein.
Don Cheadle
17
Ein Programmierer mit einer Liste von Freundinnen? Shenanigans!
E. van Putten
1
@ E.vanPutten nicht in der heutigen Zeit. Dies ist nicht die Rache der Nerds
user4052054
@DonCheadle Wenn Sie nicht erwarten, dass untergeordnete Knoten vorhanden sind, InnerTextwird nur der Knotenwert zurückgegeben. Dies ist es, was ich (und wahrscheinlich alle anderen, die diese Frage lesen) das XML analysieren, um es zuerst zu finden.
F1Krazy
48
Verwenden Sie ein gutes XSD-Schema , um eine Reihe von Klassen mit xsd.exeXmlSerializer zu erstellen, und verwenden Sie a , um einen Objektbaum aus Ihrem XML zu erstellen und umgekehrt. Wenn Sie nur wenige Einschränkungen für Ihr Modell haben, können Sie sogar versuchen, eine direkte Zuordnung zwischen Ihren Modellklassen und dem XML mit den Xml * -Attributen zu erstellen.
Leistungstipp: Der Bau eines XmlSerializerist teuer. Behalten Sie einen Verweis auf Ihre XmlSerializerInstanz bei, wenn Sie mehrere XML-Dateien analysieren / schreiben möchten.
Ein gutes Beispiel ist das "Bestellbeispiel" in der Mitte dieses Beispiels von Microsoft. msdn.microsoft.com/en-us/library/58a18dwa.aspx . Sie müssen kein Schema erstellen - Ihre c # -Klasse ist das Schema, das mit C # -Attributen geschmückt ist.
Mark Lakata
25
Wenn Sie eine große Datenmenge (viele Megabyte) verarbeiten, möchten Sie XmlReaderdie XML-Analyse streamen.
Alles andere ( XPathNavigator, XElement, XmlDocumentund auch , XmlSerializerwenn Sie die volle erzeugte Objektgraphen halten) wird in Folge hohe Speicherauslastung und auch eine sehr lange Ladezeit.
Wenn Sie ohnehin alle Daten im Speicher benötigen, haben Sie möglicherweise nicht viel Auswahl.
Zu Ihrer Information, Sie sollten nicht verwenden new XmlTextReader()oder new XmlTextWriter(). Sie sind seit .NET 2.0 veraltet. Verwenden Sie XmlReader.Create()oder XmlWriter.Create()stattdessen.
John Saunders
10
Ich musste erst kürzlich an einer Anwendung arbeiten, bei der ein XML-Dokument analysiert wurde, und ich stimme Jon Galloway zu, dass der auf LINQ to XML basierende Ansatz meiner Meinung nach der beste ist. Ich musste jedoch ein wenig graben, um brauchbare Beispiele zu finden, also hier ohne weiteres ein paar!
Kommentare sind willkommen, da dieser Code funktioniert, aber möglicherweise nicht perfekt ist. Ich würde gerne mehr über das Parsen von XML für dieses Projekt erfahren!
publicvoidParseXML(string filePath){// create document instance using XML file pathXDocument doc =XDocument.Load(filePath);// get the namespace to that within of the XML (xmlns="...")XElement root = doc.Root;XNamespace ns = root.GetDefaultNamespace();// obtain a list of elements with specific tagIEnumerable<XElement> elements =from c in doc.Descendants(ns +"exampleTagName")select c;// obtain a single element with specific tag (first instance), useful if only expecting one instance of the tag in the target docXElement element =(from c in doc.Descendants(ns +"exampleTagName"select c).First();// obtain an element from within an element, same as from docXElement embeddedElement =(from c in element.Descendants(ns +"exampleEmbeddedTagName"select c).First();// obtain an attribute from an elementXAttribute attribute = element.Attribute("exampleAttributeName");}
Mit diesen Funktionen konnte ich jedes Element und jedes Attribut aus einer XML-Datei problemlos analysieren!
Wenn Sie .NET 2.0 verwenden, versuchen Sie es mit XmlReaderseinen Unterklassen XmlTextReaderund XmlValidatingReader. Sie bieten eine schnelle, einfache (Speicherauslastung usw.) Möglichkeit, eine XML-Datei nur vorwärts zu analysieren.
Wenn Sie XPathFunktionen benötigen , probieren Sie die XPathNavigator. Wenn Sie das gesamte Dokument im Speicher benötigen, versuchen Sie es XmlDocument.
Zusätzlich können Sie den XPath-Selektor folgendermaßen verwenden (einfache Auswahl bestimmter Knoten):
XmlDocument doc =newXmlDocument();
doc.Load("test.xml");var found = doc.DocumentElement.SelectNodes("//book[@title='Barry Poter']");// select all Book elements in whole dom, with attribute title with value 'Barry Poter'// Retrieve your data here or change XML here:foreach(XmlNode book in nodeList){
book.InnerText="The story began as it was...";}Console.WriteLine("Display XML:");
doc.Save(Console.Out);
Ich bin nicht sicher, ob "Best Practice für das Parsen von XML" existiert. Es gibt zahlreiche Technologien, die für unterschiedliche Situationen geeignet sind. Welche Verwendung verwendet wird, hängt vom konkreten Szenario ab.
Sie können gehen mit LINQ to XML , XmlReader, XPathNavigatoroder sogar reguläre Ausdrücke. Wenn Sie Ihre Bedürfnisse näher erläutern, kann ich versuchen, einige Vorschläge zu machen.
Sie können das XML mithilfe dieser Bibliothek analysieren System.Xml.Linq. Unten finden Sie den Beispielcode, mit dem ich eine XML-Datei analysiert habe
Installation
Sie können ExtendedXmlSerializer von Nuget aus installieren oder den folgenden Befehl ausführen:
Install-PackageExtendedXmlSerializer
Serialisierung:
ExtendedXmlSerializer serializer =newExtendedXmlSerializer();var obj =newMessage();var xml = serializer.Serialize(obj);
Deserialisierung
var obj2 = serializer.Deserialize<Message>(xml);
Der Standard-XML-Serializer in .NET ist sehr begrenzt.
Unterstützt keine Serialisierung von Klassen mit Zirkelreferenz oder Klassen mit Schnittstelleneigenschaften.
Unterstützt keine Wörterbücher,
Es gibt keinen Mechanismus zum Lesen der alten XML-Version.
Wenn Sie einen benutzerdefinierten Serializer erstellen möchten, muss Ihre Klasse von IXmlSerializable erben. Dies bedeutet, dass Ihre Klasse keine POCO-Klasse ist.
Unterstützt IoC nicht.
ExtendedXmlSerializer kann dies und vieles mehr.
ExtendedXmlSerializer unterstützt .NET 4.5 oder höher und .NET Core . Sie können es in WebApi und AspCore integrieren.
Antworten:
Ich würde LINQ to XML verwenden, wenn Sie in .NET 3.5 oder höher sind.
quelle
Es ist sehr einfach. Ich weiß, dass dies Standardmethoden sind, aber Sie können Ihre eigene Bibliothek erstellen, um damit viel besser umzugehen.
Hier sind einige Beispiele:
Es gibt auch einige andere Methoden , mit denen Sie arbeiten können. Zum Beispiel hier . Und ich denke, es gibt keine beste Methode, um dies zu tun; Sie müssen es immer selbst auswählen, was für Sie am besten geeignet ist.
quelle
InnerText
Hier wird der Wert dieses Knotens abgerufen, der mit allen Werten der untergeordneten Knoten verknüpft ist - richtig? Scheint seltsam zu sein.InnerText
wird nur der Knotenwert zurückgegeben. Dies ist es, was ich (und wahrscheinlich alle anderen, die diese Frage lesen) das XML analysieren, um es zuerst zu finden.Verwenden Sie ein gutes XSD-Schema , um eine Reihe von Klassen mit xsd.exe
XmlSerializer
zu erstellen, und verwenden Sie a , um einen Objektbaum aus Ihrem XML zu erstellen und umgekehrt. Wenn Sie nur wenige Einschränkungen für Ihr Modell haben, können Sie sogar versuchen, eine direkte Zuordnung zwischen Ihren Modellklassen und dem XML mit den Xml * -Attributen zu erstellen.Es gibt einen Einführungsartikel zur XML-Serialisierung auf MSDN.
Leistungstipp: Der Bau eines
XmlSerializer
ist teuer. Behalten Sie einen Verweis auf IhreXmlSerializer
Instanz bei, wenn Sie mehrere XML-Dateien analysieren / schreiben möchten.quelle
Wenn Sie eine große Datenmenge (viele Megabyte) verarbeiten, möchten Sie
XmlReader
die XML-Analyse streamen.Alles andere (
XPathNavigator
,XElement
,XmlDocument
und auch ,XmlSerializer
wenn Sie die volle erzeugte Objektgraphen halten) wird in Folge hohe Speicherauslastung und auch eine sehr lange Ladezeit.Wenn Sie ohnehin alle Daten im Speicher benötigen, haben Sie möglicherweise nicht viel Auswahl.
quelle
Verwenden Sie
XmlTextReader
,XmlReader
,XmlNodeReader
und derSystem.Xml.XPath
Namespace. Und (XPathNavigator
,XPathDocument
,XPathExpression
,XPathnodeIterator
).XPath
Erleichtert normalerweise das Lesen von XML, wonach Sie vielleicht suchen.quelle
new XmlTextReader()
odernew XmlTextWriter()
. Sie sind seit .NET 2.0 veraltet. Verwenden SieXmlReader.Create()
oderXmlWriter.Create()
stattdessen.Ich musste erst kürzlich an einer Anwendung arbeiten, bei der ein XML-Dokument analysiert wurde, und ich stimme Jon Galloway zu, dass der auf LINQ to XML basierende Ansatz meiner Meinung nach der beste ist. Ich musste jedoch ein wenig graben, um brauchbare Beispiele zu finden, also hier ohne weiteres ein paar!
Kommentare sind willkommen, da dieser Code funktioniert, aber möglicherweise nicht perfekt ist. Ich würde gerne mehr über das Parsen von XML für dieses Projekt erfahren!
Mit diesen Funktionen konnte ich jedes Element und jedes Attribut aus einer XML-Datei problemlos analysieren!
quelle
Wenn Sie .NET 2.0 verwenden, versuchen Sie es mit
XmlReader
seinen UnterklassenXmlTextReader
undXmlValidatingReader
. Sie bieten eine schnelle, einfache (Speicherauslastung usw.) Möglichkeit, eine XML-Datei nur vorwärts zu analysieren.Wenn Sie
XPath
Funktionen benötigen , probieren Sie dieXPathNavigator
. Wenn Sie das gesamte Dokument im Speicher benötigen, versuchen Sie esXmlDocument
.quelle
Zusätzlich können Sie den XPath-Selektor folgendermaßen verwenden (einfache Auswahl bestimmter Knoten):
die Dokumentation
quelle
Ich bin nicht sicher, ob "Best Practice für das Parsen von XML" existiert. Es gibt zahlreiche Technologien, die für unterschiedliche Situationen geeignet sind. Welche Verwendung verwendet wird, hängt vom konkreten Szenario ab.
Sie können gehen mit LINQ to XML ,
XmlReader
,XPathNavigator
oder sogar reguläre Ausdrücke. Wenn Sie Ihre Bedürfnisse näher erläutern, kann ich versuchen, einige Vorschläge zu machen.quelle
Sie können das XML mithilfe dieser Bibliothek analysieren
System.Xml.Linq
. Unten finden Sie den Beispielcode, mit dem ich eine XML-Datei analysiert habequelle
Sie können ExtendedXmlSerializer zum Serialisieren und Deserialisieren verwenden.
Installation Sie können ExtendedXmlSerializer von Nuget aus installieren oder den folgenden Befehl ausführen:
Serialisierung:
Deserialisierung
Der Standard-XML-Serializer in .NET ist sehr begrenzt.
ExtendedXmlSerializer kann dies und vieles mehr.
ExtendedXmlSerializer unterstützt .NET 4.5 oder höher und .NET Core . Sie können es in WebApi und AspCore integrieren.
quelle
Sie können XmlDocument verwenden und zum Bearbeiten oder Abrufen von Daten aus Attributen Linq to XML-Klassen verwenden.
quelle