2016-07-06 75 views
1

我有以下行爲的loadXML和的SelectNodes

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); 

類似於第一個代碼,我會期望的WriteLine方法給出了1和0,但並非總是如此。在正常的程序運行時,它會產生雙倍的0.另外在調試時,我在第二個SelectNodes上放置斷點並檢查節點1的值。在VS中計算它在末尾給我1和0。看來的SelectNodes是XmlNodeList中的第一次檢查期間評估,不符合它在哪裏的代碼,例如下面的代碼將在1和0,每次給它運行

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); 

我知道我能做到XDOC =新XmlDocument()在第一個SelectNodes之後,它會像預期的那樣工作,但我不知道它是如何工作的,因爲我無法在msdn上找到這個場景。如果是,那爲什麼?請給我指點一些文檔。

+1

出於興趣,是否有任何理由不能使用LINQ to XML?這通常是一個更清潔的API來處理XML ... –

+0

技術上沒有。這是我的選擇,因爲我在其他LINQ不可用的系統中使用XPath。 – pen2

+1

@ pen2 - 您可以將XPath與LINQ to XML一起使用。請參閱例如[如何使用XPath與XElement或LINQ?](https://stackoverflow.com/questions/3642829/how-to-use-xpath-with-xelement-or-linq)。 – dbc

回答

0

你所看到的是有記錄的。

從文檔從XmlNodeList

將改變爲XmlNodeList收集從創建的節點對象的孩子立即反映在XmlNodeList屬性和方法返回的節點。而底層的文件保持不變

而且從文檔XmlNode.SelectNodes()

此方法返回的XmlNodeList對象將是有效的。 如果底層文檔發生更改,可能會返回意外的結果(不會引發異常)。

所以,當你覆蓋的xDoc的內容具有完全新的XML,以前創建的XmlNodeList的內容不再由Microsoft定義。

+0

謝謝!我錯過了。 – pen2