2012-06-22 18 views
5

XML dosyaları Nokogiri, Ruby ve XPath kullanarak ayrıştırmaya çalışıyorum. Genellikle herhangi bir sorun yaşamadıklarını ancak aşağıdaki ile herhangi xpath isteği yapamaz: Burada Nokogiri XPath in boş dizi döndüren [] sonuçta bekliyorum sonuçları

doc = Nokogiri::HTML(open("myfile.xml")) 
doc.("//Meta").count 
# result ==> 0 

doc.xpath("//Meta") 
# result ==> [] 

doc.xpath(.).count 
# result => 1 

benim XML dosyası bir basitleştirilmiş bir versiyonudur

<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> 

Nasıl Bu XML'den <Hit> tüm çocuklarımı alıyorum?

+1

Diğerleri ne dediklerini ama aynı zamanda Nokogiri :: HTML etiket adlarını küçültecek. Sen yerine nokogiri :: XML yerine – pguardiario

cevap

16

ad bilgilerini ekleyin: namespace ardından yukarıda kısaltılabilir

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

istiyorum 'doc.remove_namespaces! 'Diyebilirsiniz –

1

Bu en sık sorulan sorulardan biri olan XPAth soruları - "XPath varsayılan ad alanı" için arama. Kayıtlı öneki (diyelim //x:Meta içinde "x") varsayılan ad alanı için bir ad kayıt ve kullanımı hiçbir şekilde varsa

sonra kullanın:

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

o biliniyorsa Meta sadece varsayılan ait olabilir o xpath çağrılırken

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