2012-06-22 12 views
5

Estoy tratando de analizar archivos XML utilizando Nokogiri, Ruby y XPath. Por lo general no tuve ningún problema, pero con la siguiente no puedo hacer ninguna petición XPath:XPath en Nokogiri devolver matriz vacía [], mientras que espero tener resultados

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

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

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

Aquí es una versión simplificada de mi archivo 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> 

¿Cómo puede Obtengo todos los hijos de <Hit> de este XML?

+1

Lo que otros han dicho, pero también Nokogiri :: HTML mostrará los nombres de las etiquetas en minúscula. Desea Nokogiri :: XML en su lugar – pguardiario

Respuesta

16

incluir la información de espacio de nombres al llamar xpath:

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

; alternativamente puede llamar a 'doc.remove_namespaces!' –

1

Esta es una de las preguntas más frecuentes de XPAth: busque el "espacio de nombres predeterminado de XPath".

Si no hay manera de registrar un espacio de nombres para el espacio de nombres predeterminado y utilizar el prefijo registrado (por ejemplo "x" en //x:Meta) a continuación, utilizar:

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

Si se sabe que Meta sólo puede pertenecer a los valores predeterminados espacio de nombres, a continuación, lo anterior se puede reducir a:

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