【问题标题】:XPath expression to capture multiple values用于捕获多个值的 XPath 表达式
【发布时间】:2016-07-30 01:29:46
【问题描述】:

我有一个如下所示的 xml 文件:

<directory name="/MyServices/MySearchKey" read="true" write="true" show="true" exec="true" del="true" dir="true" reference="true" list="true">
  <Access xmlns:func="http://exslt.org/functions">
    <r>on</r>
    <w>on</w>
    <a>on</a>
    <d>on</d>
    <x>on</x>
  </Access>
  <directory name="/MyServices/MySearchKey/anything_else" read="true" write="true" show="true" exec="true" del="true" dir="true" reference="true" list="true">
    <Access xmlns:func="http://exslt.org/functions">
      <r>on</r>
      <w>on</w>
      <a>on</a>
      <d>on</d>
      <x>on</x>
    </Access>
    <file name="myfile_1">
      <size>5353</size>
      <modified>2016-05-20 00:39:48</modified>
      <Access xmlns:func="http://exslt.org/functions">
        <r>on</r>
        <w>on</w>
        <a>on</a>
        <d>on</d>
        <x>on</x>
      </Access>
    </file>
  </directory>
</directory>

我正在尝试编写一个独特的 XPath 表达式来捕获:

  1. 目录名称中包含MySearchKey 的任何directoryname
  2. 目录节点内的任何filename 值,其中目录名称中包含MySearchKey

当然,名称中可能有没有MySearchKey 的目录,我对它们不感兴趣,对它下面的文件也不感兴趣。 我需要过滤包含MySearchKey 的目录以及其中的任何文件

对于本例,输出如下所示:

directory name="/MyServices/MySearchKey"
directory name="/MyServices/MySearchKey/anything_else"
directory name="/MyServices/MySearchKey/anything_else/V1"
file name="myfile_1"

到目前为止,我能够编写捕获目录名称的//directory[contains(@name, '/ondisk/')]/@name,但我不知道如何添加它们包含的文件。

如何在同一个 XPath 表达式中添加文件名?

问候

【问题讨论】:

    标签: xml xpath


    【解决方案1】:

    你可以试试下面的代码:

    //directory[contains(@name, '/MySearchKey')]/(@name | file/@name)
    

    或者对于 XPath 1.0:

    //directory[contains(@name, '/MySearchKey')]/@name |
    //directory[contains(@name, '/MySearchKey')]/file/@name
    

    【讨论】:

    • 我得到“XPath 错误:无效表达式”指向最后一个 ( PS:对于测试建议,我使用 xmllint 运行它(以防它在语法上有所不同)
    • 我正在使用 xmllint 运行它(以防它在语法上有所不同)我收到以下错误:` /> xpath //directory[contains(@name, '/MySearchKey/')] /(@name|file/@name)` ` XPath error : Invalid expression` ` //directory[contains(@name, '/MySearchKey/')]/(@name|file/@name)` ` ` xmlXPathEval : 评估失败``对象为空(NULL)`(我在MySearchKey 之后添加了一个前导/ 以限制搜索,因为MySearchKey_somethingelse 之类的内容应该匹配)
    • 我相信 xmllint 只允许 xpath 1.0,请尝试 "(//directory[contains(@name, '/MySearchKey')]/@name | //directory[contains(@name, '/ MySearchKey')]/file/@name)"
    • 我不知道 [xpathtester.com/xpath] 。我将尝试使用它并很快发布结果。谢谢
    • 我已经编辑了您的原始回复,添加了您在上一条评论中提供的解决方案,这很有吸引力。感谢您的帮助
    猜你喜欢
    • 2016-01-04
    • 2012-03-24
    • 2012-03-20
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多