2014-01-11 97 views
0

我有一堆带有搜索结果的Yandex.XML文件。 http://api.yandex.com/xml/doc/dg/concepts/response.xml仅当无关元素为值时才打印xml元素

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

绘制一个类比grep,我会先用-l标志列出匹配的文档,然后通过管道这样的列表xargs xmllint提取原始查询,但也许xmllint(或其他OS X工具)具有更好的(另外,我还没有发现xmllint有一个类似-l的标志,原来的匹配在第一位)。

回答

1

搜索yandexsearch元素,其中response元素包含您正在查找的URL,然后选择该查询。

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

对于网页和搜索字符串http://www.yandex.ru给出的示例XML,它会返回下列元素:

<query>yandex</query> 

如果你的搜索字符串始终是网址的前缀,可能想要使用starts-with(...)而不是contains(...)

+0

看起来它应该做我在问什么,但我得到一个“分段错误”! – cnst

+0

很难说现在有什么问题;它可能是破坏软件(访问它可能不是内存),甚至是硬件损坏(内存有缺陷)。尝试使用更新版本的'xmllint',并发布更详细的错误信息(如果有_any_)。你怎么称呼'xmllint'? –

+0

好的,所以,当我只提供了一个应该产生结果的文件时,我得到了结果,否则,即使输入只是单个文件,我也只是出现了段错误。我几乎是用一个不同的字符串“http://www.example.org/”调用xmllint,文件也都很小。 – cnst