XPATH не возвращает результатов - PullRequest
1 голос
/ 16 октября 2010

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

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>

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

Ответы [ 3 ]

2 голосов
/ 16 октября 2010

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 голос
/ 16 октября 2010

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

0 голосов
/ 16 октября 2010

Попробуйте "// MyNode" или "Потомок :: MyNode"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...