【问题标题】:How to find elements by attribute namespace in XPath如何在 XPath 中按属性命名空间查找元素
【发布时间】:2010-10-06 11:39:03
【问题描述】:

我正在尝试使用 XPath 查找在给定命名空间中具有元素的所有元素。

例如,我想在下面的文档中找到foo:bardoodah 元素:

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:foo="http://foo.example.com">
  <foo:bar quux="value">Content</foo:bar>
  <widget>Content</widget>
  <doodah foo:quux="value">Content</doodah>
</root>

我知道我可以使用以下 XPath 表达式从给定的命名空间加载所有属性:

"//@*[namespace-uri()='http://foo.example.com']"

但是:

  • 这并没有给我元素,只是属性。
  • 如果元素包含来自该命名空间的多个属性,此选择器将返回每个属性而不是每个元素的结果

是否有可能得到我想要的,还是我必须收集属性并计算它们对应的唯一元素集?

【问题讨论】:

  • 您是否忘记为 doodah 添加命名空间?因为我看不到如何通过命名空间来选择它。
  • 如果说明不清楚,我在原始示例中使用了错误的命名空间。我的错。
  • 感谢这篇文章,它真的很有帮助。总结一下: - 从给定的命名空间获取具有属性的元素://*[@*[namespace-uri()='http://foo.example.com']] - 从给定的命名空间获取属性://@*[namespace-uri()='http://foo.example.com']

标签: xml xpath namespaces


【解决方案1】:

你可以试试

//*[namespace-uri()='http://foo.example.com' or @*[namespace-uri()='http://foo.example.com']]

它将为您提供元素 foo:bar 和元素 doodah(如果您将 XML 数据中的 tal:quux 更改为 foo:quux):

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:foo="http://foo.example.com" xmlns:tal="xxx">
  <foo:bar quux="value">Content</foo:bar>
  <widget>Content</widget>
  <doodah foo:quux="value">Content</doodah>
</root>

这是你想要的吗?

【讨论】:

  • 不完全如此... namespace-uri(./@*)='foo.example.com'] 仅当第一个属性(取决于实现!)属于该命名空间时才返回 true。如果 任何 属性属于命名空间,原始帖子希望选择该元素
【解决方案2】:

我不确定这是否是您的意思,但是通过仅删除 XPath 中的一个字符,您将获得某个命名空间中的所有元素:

//*[namespace-uri()='http://foo.example.com']

【讨论】:

  • 与该命名空间中的属性不匹配
【解决方案3】:

用途:

//*[namespace-uri()='yourNamespaceURI-here'
   or
    @*[namespace-uri()='yourNamespaceURI-here']
   ]

谓词两个条件用 XPath or 运算符进行或运算。

XPath 表达式因此选择任何元素:

  • 属于指定的命名空间。
  • 具有属于指定命名空间的属性。

【讨论】:

  • 我只需要后半部分 :) 我不知道你可以在谓词中嵌套谓词。已相应地更新了我的帖子
  • @Dimitre Novatchev 你能看看这里是命名空间问题吗? tnx stackoverflow.com/questions/7007767/…
【解决方案4】:

您的 XPath 表达式几乎是完美的。而不是要求属性“@”要求元素“”,它应该工作:

"//*[namespace-uri()='http://foo.example.com']"

【讨论】:

  • 你还没有理解这个问题。 OP 希望选择任何属于命名空间或具有至少一个属于命名空间的属性的元素。您的表达式未选择在命名空间中具有属性但该元素不属于命名空间的元素
  • 感谢您的澄清。我知道我没有理解这个问题,因为我在问题中添加了一条评论,询问为什么应该选择“doodah”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
相关资源
最近更新 更多