2010-08-25 12 views
41

estoy analizar un documento XML que se ve algo como esto:Usando XPath con sencillo en el nodo devuelve elementos en todos los nodos

<MyBook> 
    <title>Favorite Poems</title> 
    <issn>123-456</issn> 
    <pages>45</pages> 
</MyBook> 
<MyBook> 
    <title>Chocolate Desserts</title> 
    <issn>654-098</issn> 
    <pages>100</pages> 
</MyBook> 
<MyBook> 
    <title>Jabberwocky</title> 
    <issn>454-545</issn> 
    <pages>19</pages> 
</MyBook> 

utilizo XPath para sacar los nodos MYBOOK e iterar a través de ellos, así:

xmldoc.xpath("//MyBook").each do |node| 
    mytitle=node.xpath("//title").text 
    puts mytitle 
end 

la salida se ve así:

Favorite PoemsChocolateDessertsJabberwocky 
Favorite PoemsChocolateDessertsJabberwocky 
Favorite PoemsChocolateDessertsJabberwocky 

como si el nodo es realmente toda la xmldoc. Sin embargo, si imprimo el nodo dentro del iterador, cada vez que es lo que espero, solo un solo nodo MyBook. Necesito poder sacar los nodos secundarios de cada nodo sucesivamente, no todos los mismos nodos secundarios de todo el documento. ¿Qué estoy haciendo mal?

Respuesta

67

Cuando usa //title, busca todos los elementos <title> comenzando en la raíz del documento. Use simplemente title para buscar títulos secundarios, o .//title si desea encontrar títulos incluso si están anidados dentro de otros elementos.

+0

aha! Muchas gracias. Entonces, ¿no importa que aplique la expresión xpath a un nodo? – Sabrina

+2

Poner '/' o '//' al frente hace que XPath sea una ruta absoluta. Cuando los usa, el evaluador XPath ignora el nodo de contexto y comienza en la raíz del documento. –

+0

@JohnKugelman http://stackoverflow.com/questions/36412067/use-nokogiri-xpath-to-select-root-and-children-matching-expression – karl

0

Elimina // de la expresión xpath del título.

Cuestiones relacionadas