Nokogiri中的XPath返回空数组[],而我期待得到结果

时间:2012-06-22 13:06:23

标签: ruby xml xpath nokogiri

我正在尝试使用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>的所有子项?

3 个答案:

答案 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`]