2016-07-06 4 views
1

Ich habe Code ähnlich dem ersten unterVerhalten von LoadXml und Select

String xml1 = 
    @"<resultset> 
     <result> 
      <alamakota /> 
     </result> 
    </resultset>"; 
String xml2 = 
    @"<resultset/>"; 
XmlDocument xDoc = new XmlDocument(); 
xDoc.LoadXml(xml1); 
XmlNodeList nodes1 = xDoc.SelectNodes("/resultset/result"); 
xDoc.LoadXml(xml2); 
XmlNodeList nodes2 = xDoc.SelectNodes("/resultset/result"); 
Console.WriteLine(nodes1.Count); 
Console.WriteLine(nodes2.Count); 

würde ich erwarten, dass Console.WriteLine Methoden gibt 1 und 0, aber nicht immer. Im normalen Programmlauf wird es doppelt 0 geben. Auch beim Debuggen, wenn ich Haltepunkt auf zweite SelectNodes setze und den Wert von nodes1.Count in VS überprüfe, gibt es mir 1 und 0 am Ende. Es scheint, dass Select während erste Prüfung von XmlNodeList und nicht in Zeile ausgewertet wird, wo es in Code, unten zum Beispiel Code 1 und 0 jedes Mal geben läuft

String xml1 = 
    @"<resultset> 
     <result> 
      <alamakota /> 
     </result> 
    </resultset>"; 
String xml2 = 
    @"<resultset/>"; 
XmlDocument xDoc = new XmlDocument(); 
xDoc.LoadXml(xml1); 
XmlNodeList nodes1 = xDoc.SelectNodes("/resultset/result"); 
Int32 c1 = nodes1.Count; 
xDoc.LoadXml(xml2); 
XmlNodeList nodes2 = xDoc.SelectNodes("/resultset/result"); 
Console.WriteLine(nodes1.Count); 
Console.WriteLine(nodes2.Count); 

Ich weiß, dass ich tun xDoc kann = new XmlDocument() nach dem ersten SelectNodes und es wird wie erwartet funktionieren, aber ich frage mich, ob es so funktionieren sollte, weil ich dieses Szenario nicht bei msdn finden kann. Wenn ja, warum? Bitte weisen Sie mich auf eine Dokumentation hin.

+1

Interessant, gibt es einen Grund, warum Sie LINQ zu XML nicht verwenden können? Das ist in der Regel eine eher saubere API für den Umgang mit XML ... –

+0

Technisch keine. Es ist meine Wahl, weil ich XPath in anderen Systemen verwende, in denen LINQ nicht verfügbar ist. – pen2

+1

@ pen2 - Sie können XPath mit LINQ to XML verwenden. Siehe zum Beispiel [Wie verwende ich XPath mit XElement oder LINQ?] (Https://stackoverflow.com/questions/3642829/how-to-use-xpath-with-xelement-or-linq). – dbc

Antwort

0

Was Sie sehen, ist dokumentiert.

Aus der Dokumentation von XmlNodeList:

Änderungen an den Kindern des Knotens Objekt, dass die XmlNodeList Sammlung von sind sofort in den Knoten durch die XmlNodeList Eigenschaften und Methoden zurückgegebenen erstellt wurde.

und die Dokumentation für XmlNode.SelectNodes()

Das XmlNodeList Objekt von dieser Methode zurückgegeben wird gültig sein, während das zugrunde liegende Dokument unverändert bleibt. Wenn sich das zugrunde liegende Dokument ändert, werden möglicherweise unerwartete Ergebnisse zurückgegeben (es wird keine Ausnahme ausgelöst).

Also, wenn Sie den Inhalt von xDoc mit völlig neuen XML überschrieben werden soll, wird der Inhalt einer zuvor XmlNodeList erstellt werden nicht mehr durch Microsoft.

+0

Danke! Ich habe es verpasst. – pen2

Verwandte Themen