我的XML看起来像:
<?xml version=\"1.0\"?>
<itemSet>
<Item>one</Item>
<Item>two</Item>
<Item>three</Item>
.....maybe more Items here.
</itemSet>某些单独的项可能存在,也可能不存在。假设我想检索元素<Item>two</Item>,如果它存在的话。我已经尝试了下面的XPaths (在C#中)。
XMLNode node = myXMLdoc.SelectSingleNode("/itemSet[Item='two']") --如果第二项存在,那么它只返回第一个元素。也许这个查询只是指向itemSet中的第一个元素,如果它作为子元素有一个值2的项。这个解释正确吗?所以我试着:
XMLNode node = myXMLdoc.SelectSingleNode("/itemSet[Item='two']/Item[1]") --我把这个查询读为,在itemSet中返回第一个<Item>元素,它的值=‘2’。我说的对吗?这仍然只返回第一个元素。我做错了什么?在这两种情况下,使用兄弟姐妹,我可以遍历子节点并得到两个节点,但这不是我所看到的。另外,如果没有两个,那么SelectSingleNode返回null。因此,我得到一个成功的返回节点这一事实确实表明了元素2的存在,因此如果我想要一个布尔测试以chk 2的存在,那么上面的任何一个XPaths就足够了,但实际上我需要完整的元素<Item>two</Item>作为我的返回节点。
这里是我的第一个问题,也是我第一次使用web编程,所以我刚刚从过去的问题中学到了上面的XPaths和相关的xml内容。所以,温柔点,让我知道我是一个傻瓜或藐视任何社区的规则。谢谢。
发布于 2009-05-19 16:17:25
我想你想:
myXMLdoc.SelectSingleNode("/itemSet/Item[text()='two']")换句话说,您需要的是文本为2的项,而不是包含它的itemSet。
您还可以使用一个点来指示上下文节点,在您的示例中:
myXMLdoc.SelectSingleNode("/itemSet/Item[.='two']")编辑:.和text()的区别在于.实际上意味着“此节点”,而text()则表示“该节点的所有文本节点子节点”。在这两种情况下,比较将与LHS的“字符串值”进行比较。对于元素节点,字符串值是“按文档顺序排列的元素节点的所有文本节点子节点的字符串-值的连接”,对于文本节点的集合,比较将检查任何文本节点是否与您所测试的文本节点相等。
因此,元素内容只有一个文本节点并不重要,但假设我们有:
<root>
<item name="first">x<foo/>y</item>
<item name="second">xy<foo/>ab</item>
</root>然后,XPath表达式"root/item[.='xy']“将匹配第一项,而"root/item[text()='xy']”将匹配第二项。
https://stackoverflow.com/questions/883698
复制相似问题