2010-10-16 214 views
1

我有一个XMLDocument对象中加载了一些XML。我通过使用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 2010-10-16 12:17:07

+0

计数为零的列表。 – Ben 2010-10-17 20:34:00

回答

2

”MyNode“的XPATH应该可以工作,我的猜测是你的[NAMESPACE]是错误的。尝试调用没有NAMESPACE的GetElementsByTagName()。要么,要么查看循环中的代码,并确保没有格式错误的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( “/根/项目/ MYNODE”)

+0

// MyNode将获得文档中的所有MyNode元素,即使当前节点(对于node.SelectNodes(“// MyNode”))是“Item”。即,使用// MyNode将返回9个节点,而OP正在寻找6个节点。 – Les 2010-10-16 12:10:21

+0

我的不好,没有看到“Item”节点外的“MyNode”。使用完整的节点路径... – florin 2010-10-17 21:17:07

0

尝试“// MyNode“或”descendant :: MyNode“

+0

请参阅我对// MyNode上面的评论。 “descendant :: MyNode”可以工作。 – Les 2010-10-16 12:13:00