2010-10-16 2 views
1

У меня загружен некоторый XML в объект XMLDocument. Я перебор документа с помощьюXPATH не возвращает никаких результатов

For Each node As XmlNode In doc.GetElementsByTagName("Item", [NAMESPACE]) 
    'Do Stuff 
Next 

Я хотел бы использовать XPath в этом цикле, чтобы вытащить все узлы с именем «MyNode» я бы подумал я бы просто сделать узел. SelectNodes («MyNode»), но это возвращает список из нуля.

<Root> 
<Item> 
<MyNode></MyNode> 
<MyNode></MyNode> 
<MyNode></MyNode> 
<RandomOtherNode></RandomOtherNode> 
<RandomOtherNode></RandomOtherNode> 
</Item> 
<MyNode></MyNode> 
<MyNode></MyNode> 
<MyNode></MyNode> 
<RandomOtherNode></RandomOtherNode> 
<RandomOtherNode></RandomOtherNode> 
<Item> 
</Item> 
<Item> 
<MyNode></MyNode> 
<MyNode></MyNode> 
<MyNode></MyNode> 
<RandomOtherNode></RandomOtherNode> 
<RandomOtherNode></RandomOtherNode> 

</Item> 
</Root> 

Нужно ли мне что-то делать?

+0

«Возврат списка нулей»? Можете ли вы уточнить? – Les

+0

Список с нулем. – Ben

ответ

2

XPATH из« MyNode »должен работать, по моему мнению, ваш [NAMESPACE] ошибочен. Попробуйте вызвать GetElementsByTagName() без NAMESPACE. Либо это, либо посмотрите на код в вашем цикле и убедитесь, что у вас нет неправильной записи WriteLine() или что-то в этом роде.

Извините, пожалуйста, следующий пример C#, поскольку я редко использую VB. Он демонстрирует, что ваш XPATH правильный ...

string xml = @" 
<Root> 
    <Item> 
     <MyNode></MyNode> 
     <MyNode></MyNode> 
     <MyNode></MyNode> 
     <RandomOtherNode></RandomOtherNode> 
     <RandomOtherNode></RandomOtherNode> 
    </Item> 
    <MyNode></MyNode> 
    <MyNode></MyNode> 
    <MyNode></MyNode> 
    <RandomOtherNode></RandomOtherNode> 
    <RandomOtherNode></RandomOtherNode> 
    <Item> 
    </Item> 
    <Item> 
     <MyNode></MyNode> 
     <MyNode></MyNode> 
     <MyNode></MyNode> 
     <RandomOtherNode></RandomOtherNode> 
     <RandomOtherNode></RandomOtherNode> 

    </Item> 
</Root> 
"; 
     XmlDocument doc = new XmlDocument(); 
     doc.LoadXml(xml); 
     foreach (XmlNode node in doc.GetElementsByTagName("Item")) 
     { 
      foreach (XmlNode n2 in node.SelectNodes("MyNode")) 
       Console.WriteLine("{0}:{1}", node.Name, n2.Name); 
     } 
1

Чтобы получить все MyNode вы можете использовать doc.DocumentElement.SelectNodes ("// MyNode") или даже лучше doc.DocumentElement.SelectNodes ("/ Root/Item/MyNode")

+0

// MyNode получит все элементы MyNode в документе, даже если текущий узел (для node.SelectNodes («// MyNode»)) является «Item». I.e., используя // MyNode вернет 9 узлов, в то время как OP ищет шесть. – Les

+0

Мой плохой, не видел «MyNode» вне узла «Item». Используйте полный путь узла ... – florin

0

Try «// MyNode "или" descendant :: MyNode "

+0

Смотрите мой комментарий на // MyNode выше. «descendant :: MyNode» будет работать. – Les

Смежные вопросы