【问题标题】:print an xml element only if an unrelated element is value仅当不相关元素为值时才打印 xml 元素
【发布时间】:2014-01-11 04:32:27
【问题描述】:

我有一堆带有搜索结果的 Yandex.XML 文件。 http://api.yandex.com/xml/doc/dg/concepts/response.xml

我想找出所有此类 XML 文件的查询 (//yandexsearch/request/query),其中第一个 URL ((//yandexsearch/response/results/grouping/group/doc/url)[1]) 等于某个值(例如,http://www.example.org/)。

grep 进行类比,我首先使用-l 标志列出匹配的文档,然后将此类列表通过管道传递给xargs xmllint 以提取原始查询,但也许xmllint(或其他OS X 工具)有更好的方法(另外,我还没有发现 xmllint 具有类似于 -l 的标志用于原始匹配)。

【问题讨论】:

    标签: xml xpath xmllint yandex-api


    【解决方案1】:

    搜索 response 元素包含您要查找的 URL 的 yandexsearch 元素,然后选择查询。

    /yandexsearch[
      contains(
        (response/results/grouping/group/doc/url)[1],
        "http://www.example.org"
      )]/request/query
    

    对于该页面上给出的示例 XML 和搜索字符串 http://www.yandex.ru,它将返回以下元素:

    <query>yandex</query>
    

    如果您的搜索字符串始终是 url 的前缀,您可能希望使用 starts-with(...) 而不是 contains(...)

    【讨论】:

    • 看起来它应该按照我的要求做,但我遇到了“分段错误”!
    • 很难说现在是什么问题;它可能是损坏的软件(可能无法访问内存)甚至损坏的硬件(有缺陷的内存)。尝试使用较新版本的xmllint,如果有任何,请发布更详细的错误信息。你怎么打电话给xmllint
    • 好的,所以,当只提供一个应该产生结果的文件时,我会得到结果,否则,即使输入只是一个文件,我也会遇到分段错误.我几乎用一个不同的字符串“example.org”来调用 xmllint,文件也都相当小。
    • 除了分段错误之外,我没有收到任何消息。
    • 我认为这可能与没有进行选择有关,因此,整个 xpath 表达式解析为 nil。如果如上所述的表达式什么都不返回,是否有一些安全的空字符串我可以以某种方式选择?
    猜你喜欢
    • 2021-11-17
    • 1970-01-01
    • 2022-10-13
    • 2011-04-20
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多