2010-12-10 49 views
0

只選擇的childNodes後等於我OuterXML我使用的代碼是:我InnerXML與創建XPathNodeIterator

string m_myXML = "<parent>\n" + 
       " <child1>\n"+ 
       " <child2a>\n"+ 
       "  <list1 attrib=\"one\" />\n"+ 
       "  <list2 attrib=\"two\" />\n"+ 
       " </child2a>\n"+ 
       " <child2b>\n"+ 
       "  <list1 attrib=\"one\" />\n"+ 
       "  <list2 attrib=\"two\" />\n"+ 
       " </child2b>\n"+ 
       " </child1>\n"+ 
       "</parent>"; 
XmlDocument doc = new XmlDocument(); 
doc.LoadXml(m_myXML); 
XPathNavigator nav = doc.CreateNavigator(); 
XPathExpression expr; 
expr = nav.Compile("/*/*"); //Select all children of top level parents 
XPathNodeIterator iterator = nav.Select(expr); 

結果是iterator.Current.InnerXml相同iterator.Current.OuterXml,這是與原始的m_myXML相同。當我通過iterator.MoveNext()將迭代器移動到下一個時,它指向第一個child1 - 這正是我從開始就期望的。

我做錯了什麼?有沒有一個很好的和詳細的解釋dummys在那裏如何System.Xml等應該功能?

+2

那麼文檔http://msdn.microsoft.com/en-us/library/system.xml.xpath.xpathnodeiterator.aspx清楚地說:「由XPathNavigator類返回的XPathNodeIterator對象不位於第一個節點上在選定的一組節點中,必須調用XPathNodeIterator類的MoveNext方法來將XPathNodeIterator對象定位到所選節點集合中的第一個節點上。「所以我不確定爲什麼你希望迭代器處於有意義的狀態,而不用調用MoveNext或者使用for-each。 – 2010-12-10 14:08:28

+1

@MartinHonnen - 你應該把它作爲答案,而不是評論! – 2010-12-10 14:17:43

回答

0

正如Martin Honnen指出: 的良好來源是msdn/system.xml...「由XPathNavigator類返回創建XPathNodeIterator對象未在所選擇的一組節點的位於該第一個節點上的創建XPathNodeIterator類的MoveNext方法的調用必須。用於將XPathNodeIterator對象定位在所選節點集合中的第一個節點上。「

這使得PERFEKT感了 - 否則你將有麻煩了使用這樣的事情在列表中迭代:

while (iterator.MoveNext()) 
{ 
    //Do Stuff 
} 

感謝您Martin Honnen在評論部分答案 - 我完全錯過了點那個班。