我正在尝试使用Nokogiri,Ruby和XPath解析XML文件。我通常不会遇到任何问题,但有以下情况我无法提出任何xpath请求:
doc = Nokogiri::HTML(open("myfile.xml"))
doc.("//Meta").count
# result ==> 0
doc.xpath("//Meta")
# result ==> []
doc.xpath(.).count
# result => 1
以下是我的XML文件的简化版
<Answer xmlns="test:com.test.search" context="hf%3D10%26target%3Dst0" last="0" estimated="false" nmatches="1" nslices="0" nhits="1" start="0">
<time>
...
</time>
<promoted>
...
</promoted>
<hits>
<Hit url="http://www.test.com/" source="test" collapsed="false" preferred="false" score="1254772" sort="0" mask="272" contentFp="4294967295" did="1287" slice="1">
<groups>
...
</groups>
<metas>
<Meta name="enligne">
<MetaString name="value">
</MetaString>
</Meta>
<Meta name="language">
<MetaString name="value">
fr
</MetaString>
</Meta>
<Meta name="text">
<MetaText name="value">
<TextSeg highlighted="false" highlightClass="0">
La
</TextSeg>
</MetaText>
</Meta>
</metas>
</Hit>
</hits>
<keywords>
...
</keywords>
<groups>
...
</groups>
如何从此XML中获取<Hit>
的所有子项?
答案 0 :(得分:17)
在调用xpath
时包含命名空间信息:
doc.xpath("//x:Meta", "x" => "test:com.test.search")
答案 1 :(得分:8)
您可以使用remove_namespaces!
方法保存一天。
答案 2 :(得分:1)
这是常见问题XPAth问题之一 - 搜索“XPath默认命名空间”。
如果无法为默认命名空间注册名称空间并使用已注册的前缀(例如"x"
中的//x:Meta
),请使用:
//*[name() = 'Meta` and namespace-uri()='test:com.test.search']
如果知道Meta
只能属于默认命名空间,那么上面的内容可以缩短为:
//*[name() = 'Meta`]