Obwohl Sie sagen, dass es "schöner" ist, gibt es einen anderen Nachteil, wenn Sie dies gegenüber LINQ tun? Persönlich fand ich diese Methode am einfachsten, zumindest für meine Bedürfnisse.
Kolors
6
Ich habe dies geschrieben, bevor ich angefangen hatte, LINQ zu verwenden. LINQ ist nett und kann leichter lesbar sein. Ich benutze LINQ heutzutage meistens selbst. Einige Komponenten benötigen jedoch XML-Objekte im alten Stil, sodass sie ab und zu verwendet werden. Ich würde empfehlen, sowohl den "alten Stil" hier als auch LINQ auszuprobieren und zu sehen, was zu Ihnen passt.
Wolf5
1
Sollte die XmlNode node = XmlDocument.Docu...Linie nicht wirklich sein XmlNode = doc.Docu...? Warum wurde die Antwort geändert und die doc.entfernt?
Wasatchwizard
Wahr. Ich habe keine Ahnung, warum ich das geändert habe ... Wird behoben.
// Loading from a file, you can also load from a streamvar xml =XDocument.Load(@"C:\contacts.xml");// Query the data and write out a subset of contactsvar query =from c in xml.Root.Descendants("contact")where(int)c.Attribute("id")<4select c.Element("firstName").Value+" "+
c.Element("lastName").Value;foreach(string name in query){Console.WriteLine("Contact's Full Name: {0}", name);}
XDocument.Parse ("<xml> etwas </ xml>"); für eine Zeichenfolge.
Wolf5
2
Leute, die die Includes nicht enthalten, sind gemein, danke für die Antwort tho :)
Gabriel Garcia
@GabrielGarcia wahr, manchmal steckte Anfänger bei fehlendem Include-Fehler fest
Anonym
1
Was sind die relevanten Includes?
Sayth
18
Hier ist eine Anwendung, die ich zum Lesen von XML-Sitemaps geschrieben habe:
usingSystem;usingSystem.Collections.Generic;usingSystem.Windows.Forms;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.IO;usingSystem.Data;usingSystem.Xml;namespaceSiteMapReader{classProgram{staticvoidMain(string[] args){Console.WriteLine("Please Enter the Location of the file");// get the location we want to get the sitemaps from string dirLoc =Console.ReadLine();// get all the sitemaps string[] sitemaps =Directory.GetFiles(dirLoc);StreamWriter sw =newStreamWriter(Application.StartupPath+@"\locs.txt",true);// loop through each file foreach(string sitemap in sitemaps){try{// new xdoc instance XmlDocument xDoc =newXmlDocument();//load up the xml from the location
xDoc.Load(sitemap);// cycle through each child noed foreach(XmlNode node in xDoc.DocumentElement.ChildNodes){// first node is the url ... have to go to nexted loc node foreach(XmlNode locNode in node){// thereare a couple child nodes here so only take data from node named loc if(locNode.Name=="loc"){// get the content of the loc node string loc = locNode.InnerText;// write it to the console so you can see its working Console.WriteLine(loc +Environment.NewLine);// write it to the file
sw.Write(loc +Environment.NewLine);}}}}catch{}}Console.WriteLine("All Done :-)");Console.ReadLine();}staticvoid readSitemap(){}}}
XmlSerializer. Verwenden Sie eine Klasse mit dem Zielschema, das Sie lesen möchten. Verwenden Sie XmlSerializer, um die Daten in einer XML-Datei abzurufen, die in eine Instanz der Klasse geladen wird.
Außerdem bietet VB.NET eine viel bessere Unterstützung für das XML-Parsen über den Compiler als C #. Wenn Sie die Option und den Wunsch haben, probieren Sie es aus.
"Alles falsch"? Nicht genau, sollte ich denken, es sei denn, diese Aussage war im Scherz. Das OP hat keine Informationen zur Verfügung gestellt. über die .NET-Version, an der er arbeitet.
Cerebrus
1
Heh, ja. Es war ein Scherz, aber ich bin nicht lustig, also habe ich es entfernt.
7
Sie können ein DataSet zum Lesen von XML-Zeichenfolgen verwenden.
var xmlString =File.ReadAllText(FILE_PATH);var stringReader =newStringReader(xmlString);var dsSet =newDataSet();
dsSet.ReadXml(stringReader);
sehr gut! Es ist der schnellste Weg, Informationen aus SQL XML-Spalten und .net zu teilen.
elle0087
Nicht ideal, wenn Sie mehrere Ebenen haben, da anscheinend jede Ebene in einer eigenen Tabelle innerhalb des Datasets abgelegt wird.
Lenny K
Auch dafür ist es noch in Ordnung. Ich denke, es hängt wirklich davon ab, wie Ihre Daten tatsächlich aussehen und wie viele Ebenen tief die Daten sind, nach denen Sie suchen.
publicvoidReadXmlFile(){string path =HttpContext.Current.Server.MapPath("~/App_Data");// Finds the location of App_Data on server.XmlTextReader reader =newXmlTextReader(System.IO.Path.Combine(path,"XMLFile7.xml"));//Combines the location of App_Data and the file namewhile(reader.Read()){switch(reader.NodeType){caseXmlNodeType.Element:break;caseXmlNodeType.Text:
columnNames.Add(reader.Value);break;caseXmlNodeType.EndElement:break;}}}
Sie können die erste Anweisung vermeiden und einfach den Pfadnamen im Konstruktor von XmlTextReader angeben.
Es gibt verschiedene Möglichkeiten, je nachdem, wo Sie hin möchten. XmlDocument ist leichter als XDocument. Wenn Sie jedoch minimalistisch überprüfen möchten, ob eine Zeichenfolge XML enthält, ist der reguläre Ausdruck möglicherweise die schnellste und leichteste Wahl, die Sie treffen können. Zum Beispiel habe ich Smoke Tests mit SpecFlow für meine API implementiert und möchte testen, ob eines der Ergebnisse in einem gültigen XML vorliegt - dann würde ich einen regulären Ausdruck verwenden. Wenn ich jedoch Werte aus diesem XML extrahieren muss, würde ich es mit XDocument analysieren, um es schneller und mit weniger Code zu erledigen. Oder ich würde XmlDocument verwenden, wenn ich mit einem großen XML arbeiten muss (und manchmal arbeite ich mit XMLs, die ungefähr 1 Million Zeilen umfassen, sogar mehr). dann konnte ich es sogar Zeile für Zeile lesen. Warum? Versuchen Sie, in Visual Studio mehr als 800 MB in privaten Bytes zu öffnen. Selbst in der Produktion sollten Sie keine Objekte haben, die größer als 2 GB sind. Sie können mit einem twerk, aber Sie sollten nicht. Wenn Sie ein Dokument analysieren müssten, das VIELE Zeilen enthält, handelt es sich bei diesen Dokumenten wahrscheinlich um CSV.
Ich habe diesen Kommentar geschrieben, weil ich viele Beispiele mit XDocument sehe. XDocument eignet sich nicht für große Dokumente oder wenn Sie nur überprüfen möchten, ob der Inhalt XML-gültig ist. Wenn Sie überprüfen möchten, ob das XML selbst sinnvoll ist, benötigen Sie Schema.
Ich habe auch die vorgeschlagene Antwort abgelehnt, weil ich glaube, dass sie die oben genannten Informationen in sich selbst benötigt. Stellen Sie sich vor, ich muss überprüfen, ob 200M XML 10-mal pro Stunde gültiges XML ist. XDocument wird eine Menge Ressourcen verschwenden.
prasanna venkatesh gibt außerdem an, dass Sie versuchen könnten, die Zeichenfolge in ein Dataset einzufügen. Dies zeigt auch gültiges XML an.
Antworten:
XmlDocument zum Lesen eines XML aus einer Zeichenfolge oder einer Datei.
oder
dann finden Sie einen Knoten darunter, dh wie folgt
oder
Lesen Sie dann den Text in diesem Knoten wie folgt
oder lesen Sie ein Attribut
Überprüfen Sie Attribute ["etwas"] immer auf null, da sie null sind, wenn das Attribut nicht vorhanden ist.
quelle
XmlNode node = XmlDocument.Docu...
Linie nicht wirklich seinXmlNode = doc.Docu...
? Warum wurde die Antwort geändert und diedoc.
entfernt?LINQ to XML Beispiel:
Referenz : LINQ to XML bei MSDN
quelle
Hier ist eine Anwendung, die ich zum Lesen von XML-Sitemaps geschrieben habe:
Code auf dem Einfügebehälter http://pastebin.com/yK7cSNeY
quelle
Es gibt viele Möglichkeiten, einige:
quelle
Du kannst entweder:
Beispiele finden Sie auf den bereitgestellten msdn-Seiten
quelle
Linq zu XML.
Außerdem bietet VB.NET eine viel bessere Unterstützung für das XML-Parsen über den Compiler als C #. Wenn Sie die Option und den Wunsch haben, probieren Sie es aus.
quelle
Sie können ein DataSet zum Lesen von XML-Zeichenfolgen verwenden.
Posting dies zur Information.
quelle
Schauen Sie sich zum Beispiel die XmlTextReader- Klasse an.
quelle
Sie können die erste Anweisung vermeiden und einfach den Pfadnamen im Konstruktor von XmlTextReader angeben.
quelle
Es gibt verschiedene Möglichkeiten, je nachdem, wo Sie hin möchten. XmlDocument ist leichter als XDocument. Wenn Sie jedoch minimalistisch überprüfen möchten, ob eine Zeichenfolge XML enthält, ist der reguläre Ausdruck möglicherweise die schnellste und leichteste Wahl, die Sie treffen können. Zum Beispiel habe ich Smoke Tests mit SpecFlow für meine API implementiert und möchte testen, ob eines der Ergebnisse in einem gültigen XML vorliegt - dann würde ich einen regulären Ausdruck verwenden. Wenn ich jedoch Werte aus diesem XML extrahieren muss, würde ich es mit XDocument analysieren, um es schneller und mit weniger Code zu erledigen. Oder ich würde XmlDocument verwenden, wenn ich mit einem großen XML arbeiten muss (und manchmal arbeite ich mit XMLs, die ungefähr 1 Million Zeilen umfassen, sogar mehr). dann konnte ich es sogar Zeile für Zeile lesen. Warum? Versuchen Sie, in Visual Studio mehr als 800 MB in privaten Bytes zu öffnen. Selbst in der Produktion sollten Sie keine Objekte haben, die größer als 2 GB sind. Sie können mit einem twerk, aber Sie sollten nicht. Wenn Sie ein Dokument analysieren müssten, das VIELE Zeilen enthält, handelt es sich bei diesen Dokumenten wahrscheinlich um CSV.
Ich habe diesen Kommentar geschrieben, weil ich viele Beispiele mit XDocument sehe. XDocument eignet sich nicht für große Dokumente oder wenn Sie nur überprüfen möchten, ob der Inhalt XML-gültig ist. Wenn Sie überprüfen möchten, ob das XML selbst sinnvoll ist, benötigen Sie Schema.
Ich habe auch die vorgeschlagene Antwort abgelehnt, weil ich glaube, dass sie die oben genannten Informationen in sich selbst benötigt. Stellen Sie sich vor, ich muss überprüfen, ob 200M XML 10-mal pro Stunde gültiges XML ist. XDocument wird eine Menge Ressourcen verschwenden.
prasanna venkatesh gibt außerdem an, dass Sie versuchen könnten, die Zeichenfolge in ein Dataset einzufügen. Dies zeigt auch gültiges XML an.
quelle