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教程有一个易于摘要格式的有用信息。
答
您在stuffChild
前使用的//
表示您正在寻找从根开始的stuffChild
元素。
如果你想从当前节点开始(当前节点的decendants),你应该使用.//
,如:
stuff.SelectSingleNode(".//stuffChild");
答
如果“stuffChild”是“东西”的子节点,然后您的xpath应该是:
XmlNode stuffChild = stuff.SelectSingleNode("stuffChild");
答
选择单个节点意味着您只需要第一个元素。所以,最好的解决方案是:
XmlNode stuffChild = stuff.SelectSingleNode("descendant::stuffChild[1]");
。//foo是** not **等于descendant :: foo并且通常**错误**选择后代节点的方式。请参阅http://stackoverflow.com/questions/453191/ – 2009-02-23 00:16:04