2012-06-22 31 views
5

我想使用Nokogiri,Ruby和XPath來解析XML文件。我通常不會遇到任何問題,但接下來,我不能作出任何XPath要求:Nokogiri中的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>的所有子項?

+1

別人都說過,但也Nokogiri :: HTML將小寫標記名稱。你想Nokogiri :: XML代替 – pguardiario

回答

16

包括命名空間信息:命名空間,那麼上述可縮短至

doc.xpath("//x:Meta", "x" => "test:com.test.search") 
+9

或者你可以調用'doc.remove_namespaces!' –

1

這是最常見的XPAth問題之一 - 搜索「XPath默認命名空間」。

如果沒有辦法註冊爲默認命名空間的命名空間,並使用已註冊的前綴(比如"x"//x:Meta),然後使用:

//*[name() = 'Meta` and namespace-uri()='test:com.test.search'] 

如果已知Meta只能屬於默認主叫xpath

//*[name() = 'Meta`]