【问题标题】:xmllint match and extract valuexmllint 匹配并提取值
【发布时间】:2015-04-25 10:31:38
【问题描述】:

我只想从 xml 中提取“图像”,但由于前几个不包含“图像”而出现错误。

<?xml version='1.0' encoding='utf-8'?>
<document>
    <job name="Job1">
        <type>
            <description>
            </description>
        </type>
    </job>
    <job name="Job2">
        <type>
            <description>
            </description>
        </type>
    </job>
    <job name="Job3">
        <type>
            <description>
                <image>
                    <png></png>
                </image>
            </description>
        </type>
    </job>
</document>

如何跳过前两个,匹配第三个图片标签?

xmllint --xpath "//*[local-name()='document']/job/type/description/image/png/text()" file

【问题讨论】:

  • 什么错误,完全正确?您的代码应该已经按照您的描述进行。另外,为什么local-name 搞得这么乱?有没有你没有向我们展示的命名空间?
  • @MathiasMüller, ...尽管在给出的示例文档中,png 没有子文本节点。 OP 选择不在他们的问题中提供的错误是“XPath 集为空”。
  • XPath 查询在许多方面都像 SQL 连接一样——它已经确实继续寻找符合所有规范的元素,而不是放弃如果它开始的第一条路径不成功。

标签: xml xpath xmllint


【解决方案1】:

如果我只修改你的输入文件的一行,改变

<png></png>

<png>Some text goes here</png>

...那么您的代码就像已经编写的那样完美运行。因此,该错误与前几个没有pngdescriptions 无关。


请注意,由于您没有定义任何命名空间,因此您根本不需要搞乱local-name()

xmllint --xpath "/document/job/type/description/image/png/text()"

...同样有效。

【讨论】:

  • ...复制并粘贴您在此处提供的确切输入(与您未向我们显示的原始文件相反)并更改给定的一行之后?
  • 加 1,规范路径表达式也会将 // 替换为 /
  • @MathiasMüller,确实如此。经过适当调整,现在效率更高了。
猜你喜欢
  • 1970-01-01
  • 2020-01-12
  • 2017-12-26
  • 1970-01-01
  • 1970-01-01
  • 2021-01-09
  • 1970-01-01
  • 1970-01-01
  • 2021-02-01
相关资源
最近更新 更多