Мой InnerXML равен моему OuterXML после выбора только дочерних узлов с 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 - что я и ожидал от него в самом начале.

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

1 ответ

Решение

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

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

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

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

Другие вопросы по тегам