Pregunta

Estoy creando un Yahoo! Widget y lo he hecho antes sin ningún problema (creando un widget). Recibo un documento xml a través de un enlace web y deseo que todos los nodos introduzcan un árbol. Estoy haciendo esto:

var request = new XMLHttpRequest();
        request.open( "GET", url, false );
        request.send();
        if ( request.status == 200 )
        {
            doc = request.responseXML;
            tree = doc.evaluate("/lfm");
            status = tree.item(0).getAttribute("status")
            if(status == "ok")
            {
                print ("status is ok!");
                tracks = doc.evaluate("/lfm/recenttracks[1]/track");
                for(i=0;i<tracks.length;i++)
                {
                    artist = tracks.item(i).firstChild.firstChild.data;
                }
            }
        }
    }

De esta manera, puede obtener el nodo artista fuera del árbol . aunque hay un problema si quieres tener el siguiente hermano . Tienes que llamar

tracks.item(i).firstChild.nextSibling.firstChild.data;
tracks.item(i).firstChild.nextSibling.nextSibling.firstChild.data;
tracks.item(i).firstChild.nextSibling.nextSibling.nextSibling.firstChild.data;

para hacer esto. El nodo al lado agrega un 'nextsibling' y así sucesivamente. No quiero seguir agregando estos nodos y pensé que sería posible utilizar childNodes [i] de esta forma:

artist = tracks.item(i).childNodes[0].firstChild.data;
nextitem = tracks.item(i).childNodes[1].firstChild.data;

esto no funciona sin embargo. devuelve " childNodes [0] no tiene propiedades " de cualquier forma que lo use. Ahora creo que también hay una forma en Xpath para hacer esto en un ciclo for:

name = doc.evaluate("string(/lfm/recenttracks[1]/track["+i+"]/name)");
                    print(name);
othernode = doc.evaluate("string(/lfm/recenttracks[1]/track["+i+"]/album)");
                    print(othernode);

y luego aumentar i para la siguiente pista. pero de alguna manera esto devuelve solo un elemento . no recupera más elementos en un bucle para . i-1 tampoco funciona.

¿Alguien sabe cómo usar una expresión Xpath con mi valor i para elegir un nodo y luego obtener los subnodos por supernodo? Por pista quiero obtener artista, nombre, streamable, mbid, álbum, url, imagen (pequeña), imagen (mediana), imagen (grande) y fecha.

mi archivo xml se ve así:

<lfm status="ok">
   <recenttracks user="xaddict">
      <track nowplaying="true"> 
         <artist mbid="f5b8ea5f-c269-45dd-9936-1fedf3c56851">The Presets</artist>
         <name>Girl (You Chew My Mind Up)</name>
         <streamable>1</streamable>
         <mbid></mbid>
         <album mbid="b150d099-b0f3-4feb-9a05-34e693c6dd24">Beams</album>
         <url>http://www.last.fm/music/The+Presets/_/Girl+%28You+Chew+My+Mind+Up%29</url>
         <image size="small">http://userserve-ak.last.fm/serve/34s/8696437.jpg</image>
         <image size="medium">http://userserve-ak.last.fm/serve/64s/8696437.jpg</image>
         <image size="large">http://userserve-ak.last.fm/serve/126/8696437.jpg</image>
         <date uts="1236440600">7 Mar 2009, 15:43</date>
      </track>
      <track > 
         <artist mbid="f5b8ea5f-c269-45dd-9936-1fedf3c56851">The Presets</artist>
         <name>Get Outta Here</name>
         <streamable>1</streamable>
         <mbid></mbid>
         <album mbid="0469956f-d895-4120-8ec5-29ad41b9e2fd">Blow Up</album>
         <url>http://www.last.fm/music/The+Presets/_/Get+Outta+Here</url>
         <image size="small">http://userserve-ak.last.fm/serve/34s/20923179.png</image>
         <image size="medium">http://userserve-ak.last.fm/serve/64s/20923179.png</image>
         <image size="large">http://userserve-ak.last.fm/serve/126/20923179.png</image>
         <date uts="1236440242">7 Mar 2009, 15:37</date>
      </track>
   </recenttracks>
</lfm>
¿Fue útil?

Solución 3

la forma totalmente habilitada de Xpath de hacer esto es mediante la conversión de cadenas en Xpath. Ya publiqué este código como respuesta a otra pregunta y lo volveré a hacer. Estoy muy contento de haber descubierto esta forma de hacer las cosas.

var entries = xmlDoc.evaluate("lfm/recenttracks/track");
var length = entries.length;
for(var i = 0; i &lt; length; i++) {
   var entry = entries.item(i);
   var obj = {
      artist: entry.evaluate("string(artist)"),
      name: entry.evaluate("string(name)"),
      url: entry.evaluate("string(url)"),
      image: entry.evaluate("string(image[@size='medium'])")
   };
posts[i] = obj;
}

Otros consejos

Prueba esto

 for (var i = 0; i < xmlDoc.getElementsByTagName('track').length; i++)
            {
                alert(xmlDoc.getElementsByTagName('track')[i].getElementsByTagName('name')[0].childNodes[0].nodeValue); 
            }

si desea utilizar xpath, también puede probar la solución a continuación.

var s = xmlDoc.evaluate( '//track' ,xmlDoc, null, XPathResult.ANY_TYPE, null );
var track = s.iterateNext();

while (track)
{
     alert(track.getElementsByTagName('name')[0].textContent );
     track = s.iterateNext();
}

¿Puedes publicar el fragmento XML relevante? Estamos viendo el código que lo analiza, pero si tuviéramos el propio XML, sería más fácil realizar una consulta de Xpath. Lo más útil sería el bit que tiene elementos como

<lfm>
    <recenttracks>
        <track>
            <album>

etc

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top