2010-10-28 9 views
6

Tengo una pregunta muy simple que parece que no puedo encontrar una respuesta.Accediendo a un conjunto de nodos en una consulta XPath de JavaScript

Quiero comprimir dos instrucciones XPath (que obtienen valores de atributo). Aprendí sobre el operador |, escuchando cómo devuelve conjuntos de nodos.

var getdata = xmldoc.evaluate 
(
    '/foo/bar[@world=\''+hello+'\']/child::*/attribute::name 
    |/foo/bar[@world=\''hello+'\']/child::*/attribute::id', 
    xmldoc, null, XPathResult.ANY_TYPE, null 
); 

Para cualquiera que se pregunte, no, yo no formato a mis cuerdas de evaluación de esa manera ... aunque, en cierto modo me gusta ahora que he escrito a cabo. De todos modos, así es como lo probé.

alert(getItemData.iterateNext().childNodes[0].nodeValue); 

Eso funciona! Pero solo devuelve el primero. Mientras escribía esto, intenté con .length e hice un descanso ... solo cuenta un elemento. ¿Fui engañado sobre el concepto de |? ¿Cómo puedo obtener un set y luego revisarlo?

documento XML, según lo solicitado.

<?xml version="1.0" encoding="ISO-8859-1"?> 
<foo> 
    <bar world="hello" id="1"> 
     <subbar name="item1" id="2"> 
     </subbar> 
    </bar> 
    <bar world="bye" id="3"> 
     <subbar name="item2" id="4"> 
     </subbar> 
    </bar> 
</foo> 

Editar: Actualmente estoy usando una función que toma el elemento en lugar del atributo, pero me gustaría conocer a la otra manera. A menos que lo que estoy haciendo sea la mejor manera.

+0

¿También puede publicar también el documento XML que está aplicando la declaración XPath? – orangepips

Respuesta

0

Bueno, su uso de la "tubería" es correcto (http://www.tizag.com/xmlTutorial/xpathbar.php) por lo que el único código que puedo ver podría estar apagado es un + en el segundo comando xpath, pero podría ser un seudo código, así que solo contaría esto como una media respuesta. En cuanto a la mejor práctica, en mi opinión, tomaría el elemento de la subbarra y luego tomaría sus atributos donde los necesitara; una optimización como la que ha sugerido oscurece los datos a los que se hace referencia. Parece demasiada mico-optimización, pero esto es solo una opinión. Tal vez tiene una larga lista de atributos y realmente está ahorrando tiempo de análisis.

1

Si JQuery es una opción, podría valer la pena revisar su biblioteca XML transversal. Una búsqueda rápida apareció en un artículo here. Escribí un ejemplo muy aproximado de cómo se verá la lógica después de importar el documento xml, que se explica en el enlace.

var hello = "foo"; 
$('bar[world=' + hello + '] > subbar').each(function() { 
    // You'd want to save these values somewhere else, obviously. 
    $(this).getAttribute(name); 
    $(this).getAttribute(id); 
}); 
+0

Agradezco la respuesta, pero prefiero evitar jQuery. – Tarik

1

La clave aquí es el tipo de XPathResult que utiliza.

He implementado una muestra de trabajo para la misma. Por favor refiérase al código en http://jsbin.com/eneso3/5/edit

Básicamente tiene que usar Iterator como tipo de resultado para poder iterar a través de ellos para obtener el texto. Consulte la referencia de Xpath mencionada en la página de muestra del código de trabajo.

Cuestiones relacionadas