XPath和选择单个节点

XPath和选择单个节点

问题描述:

我使用XPath在.NET来解析XML文档,沿着线:XPath和选择单个节点

XmlNodeList lotsOStuff = doc.SelectNodes("//stuff"); 

foreach (XmlNode stuff in lotsOStuff) { 
    XmlNode stuffChild = stuff.SelectSingleNode("//stuffChild"); 
    // ... etc 
} 

的问题是,XPath查询为stuffChild总是返回的孩子第一个stuff元素,从来没有其余的。 XPath不能用于查询个人XMLElement

//在XPath表达式开始时从文档根开始。尝试“.// stufffuild”。 。是self :: node()的简写,它将设置搜索的上下文,// //是后代轴的简写。

所以,你必须:

XmlNode stuffChild = stuff.SelectSingleNode(".//stuffChild"); 

翻译为:

的xmlNode stuffChild = stuff.SelectSingleNode( “自::节点()/后裔:: stuffChild”);

xmlNode stuffChild = stuff.SelectSingleNode("self::node()/descendant-or-self::stuffChild"); 

在那里的孩子节点可以具有相同的名称作为家长,你可能需要使用下面的稍微详细的语法,以确保你没有的情况下再选择父:

xmlNode stuffChild = stuff.SelectSingleNode("self::node()/descendant::stuffChild"); 

还要注意的是,如果“stuffChild”是“东西”的直系后裔,你可以完全忽略前缀,只是选择“stuffChild”。

XmlNode stuffChild = stuff.SelectSingleNode("stuffChild"); 

W3Schools教程有一个易于摘要格式的有用信息。

+0

。//foo是** not **等于descendant :: foo并且通常**错误**选择后代节点的方式。请参阅http://stackoverflow.com/questions/453191/ – 2009-02-23 00:16:04

您在stuffChild前使用的//表示您正在寻找从根开始的stuffChild元素。

如果你想从当前节点开始(当前节点的decendants),你应该使用.//,如:

stuff.SelectSingleNode(".//stuffChild"); 

如果“stuffChild”是“东西”的子节点,然后您的xpath应该是:

XmlNode stuffChild = stuff.SelectSingleNode("stuffChild"); 

选择单个节点意味着您只需要第一个元素。所以,最好的解决方案是:

XmlNode stuffChild = stuff.SelectSingleNode("descendant::stuffChild[1]");