2010-12-10 62 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在评论部分答案 - 我完全错过了点那个班。