Мой InnerXML равен моему OuterXML после выбора только дочерних узлов с XPathNodeIterator - PullRequest
0 голосов
/ 10 декабря 2010

Код, который я использую:

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 - что я и ожидал от него в самом начале.

Я что-то не так делаю? Есть ли хорошее и подробное объяснение для чайников, как System.Xml и т. Д. Должны функционировать?

1 Ответ

0 голосов
/ 10 декабря 2010

Как Мартин Хоннен указал: Хороший источник: msdn / system.xml ..."Объект XPathNodeIterator, возвращаемый классом XPathNavigator, не расположен на первом узле в выбранном наборе узлов. Вызов метода MoveNext в XPathNodeIterator должен быть создан класс для размещения объекта XPathNodeIterator на первом узле в выбранном наборе узлов. "

Это делает Perfekt Sense теперь - потому что в противном случае у вас были бы проблемы с итерацией по списку, используя что-то вроде этого:

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

Спасибо Мартин Хоннен за ваш ответ в разделе комментариев - я полностью упустил пункт об этом классе.

...