首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SelectSingleNode中使用SelectSingleNode:从SelectSingleNode中检索单个元素(如果存在)

在SelectSingleNode中使用SelectSingleNode:从SelectSingleNode中检索单个元素(如果存在)
EN

Stack Overflow用户
提问于 2009-05-19 16:12:06
回答 1查看 57.1K关注 0票数 13

我的XML看起来像:

代码语言:javascript
复制
<?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内容。所以,温柔点,让我知道我是一个傻瓜或藐视任何社区的规则。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-05-19 16:17:25

我想你想:

代码语言:javascript
复制
myXMLdoc.SelectSingleNode("/itemSet/Item[text()='two']")

换句话说,您需要的是文本为2的项,而不是包含它的itemSet

您还可以使用一个点来指示上下文节点,在您的示例中:

代码语言:javascript
复制
myXMLdoc.SelectSingleNode("/itemSet/Item[.='two']")

编辑:.text()的区别在于.实际上意味着“此节点”,而text()则表示“该节点的所有文本节点子节点”。在这两种情况下,比较将与LHS的“字符串值”进行比较。对于元素节点,字符串值是“按文档顺序排列的元素节点的所有文本节点子节点的字符串-值的连接”,对于文本节点的集合,比较将检查任何文本节点是否与您所测试的文本节点相等。

因此,元素内容只有一个文本节点并不重要,但假设我们有:

代码语言:javascript
复制
<root>
  <item name="first">x<foo/>y</item>
  <item name="second">xy<foo/>ab</item>
</root>

然后,XPath表达式"root/item[.='xy']“将匹配第一项,而"root/item[text()='xy']”将匹配第二项。

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/883698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档