【问题标题】:XPath 使用 local-name() 从命名空间 XML 中选择值?
【发布时间】:2022-01-22 21:58:27
【问题描述】:

如何提取/substance/text/makers/text的值?

我期待结果是

  1. 自动化
  2. 测试记录

我已经尝试了很多东西,例如:

  • //*[local-name()='text/@value']
  • //*[local-name()='substance']/text/text()
  • //*[local-name()='name'][1]
    (这适用于名字元素,但如果我对文本使用类似的,它就不起作用。)
  • //*[local-name()='text/@value'][1]
  • //*[local-name()='text'][1]
<health xmlns="http://test.com/sample">
    <substance>
        <name>substance</name>
        <text value="Automation"/>
    </substance>
    <user>
        <reference value="User/111111122"/>
    </user>
    <reaction>
        <makers>
            <name>makers</name>
            <text value="Test Record"/>
        </makers>
    </reaction>
</health>

【问题讨论】:

  • 你所尝试的例子表明你在猜测,你并没有真正理解这些表达的意思。您需要做一些阅读以更好地掌握这些概念!显然,您的文档中没有名称为“text/@value”的元素 - 这不是合法名称。

标签: xml xpath xml-namespaces


【解决方案1】:

这个 XPath,

//*[local-name()='text']/@value

将选择文档中所有text 元素的所有value 属性,而不考虑名称空间。

请注意,考虑命名空间比以这种方式击败它们更好。见How does XPath deal with XML namespaces?


不工作?

提供的 XPath 确实选择了 @value 属性。如果您只看到一个,很可能是因为您将结果传递给 XPath 1.0 函数,该函数需要一个值,并且定义为在传递多个值时选择节点集的第一个成员。见Why does XPath expression only select text of first element?


还是不行?

这里有两个选项用于单独而不是集体选择值:

  1. (//*[local-name()='text']/@value)[1]
    (//*[local-name()='text']/@value)[2]

  2. //*[local-name()='substance']/*[local-name()='text']/@value
    //*[local-name()='makers']/*[local-name()='text']/@value

【讨论】:

  • 感谢它为第一个 /substance/text 工作,我还需要从 /makers/text 中提取值。我们如何在 start 中给父节点?
  • 实际上我将每个值存储到一个变量中,因此//*[local-name()='text']/@value 返回Automation 并存储在变量中,所以现在我必须以某种方式获取第二个值。有没有办法在这个表达式中传递父节点?
  • 以上两个选项都不起作用。当我将数组更改为选项 1 时,选项 2 根本不起作用,而对于选项 1:(//*[local-name()='text']/@value)[1] and (//*[local-name()='text']/@value)[2] 它适用于 [1] 但不适用于 [2]。
  • 查看更新的答案。如果显示的选项仍然不适合您,我怀疑您发布的 XML 和实际的 XML 之间存在差异,或者您如何使用 XPath 表达式返回的结果存在问题。
  • 感谢您的帮助。它工作正常我的代码中有一个错误,所以一旦我更正它就开始工作了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
  • 2010-09-11
  • 2011-07-27
  • 2011-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多