Cómo utilizar jQuery para el análisis XML con espacios de nombres

Resuelto Brian Liang asked hace 15 años • 20 respuestas

Soy nuevo en jQuery y me gustaría analizar un documento XML.

Puedo analizar XML normal con los espacios de nombres predeterminados pero con XML como:

<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">
   <s:Schema id="RowsetSchema">
     <s:ElementType name="row" content="eltOnly" rs:CommandTimeout="30">
       <s:AttributeType name="ows_ID" rs:name="ID" rs:number="1">
        <s:datatype dt:type="i4" dt:maxLength="4" />
      </s:AttributeType>
       <s:AttributeType name="ows_DocIcon" rs:name="Type" rs:number="2">
        <s:datatype dt:type="string" dt:maxLength="512" />
      </s:AttributeType>
       <s:AttributeType name="ows_LinkTitle" rs:name="Title" rs:number="3">
        <s:datatype dt:type="string" dt:maxLength="512" />
      </s:AttributeType>
       <s:AttributeType name="ows_ServiceCategory" rs:name="Service Category" rs:number="4">
        <s:datatype dt:type="string" dt:maxLength="512" />
      </s:AttributeType>
    </s:ElementType>
  </s:Schema>
   <rs:data>
    <z:row ows_ID="2" ows_LinkTitle="Sample Data 1" />
    <z:row ows_ID="3" ows_LinkTitle="Sample Data 2" />
    <z:row ows_ID="4" ows_LinkTitle="Sample Data 3" />
  </rs:data>
</xml>

Todo lo que realmente quiero es el<z:row> .

Hasta ahora he estado usando:

$.get(xmlPath, {}, function(xml) {
    $("rs:data", xml).find("z:row").each(function(i) {
        alert("found zrow");
    });
}, "xml");

Realmente sin suerte. ¿Algunas ideas?

Brian Liang avatar May 12 '09 23:05 Brian Liang
Aceptado

Lo tengo.

Resulta que es necesario \\escapar del colon.

$.get(xmlPath, {}, function(xml) {
    $("rs\\:data", xml).find("z\\:row").each(function(i) {
        alert("found zrow");
    });
}, "xml");

Como señaló Rich:

La mejor solución no requiere escape y funciona en todos los navegadores "modernos":

.find("[nodeName=z:row]")
Brian Liang avatar May 13 '2009 14:05 Brian Liang

He pasado varias horas leyendo sobre complementos y todo tipo de soluciones sin suerte.

ArnisAndy publicó un enlace a una discusión sobre jQuery, donde se ofrece esta respuesta y puedo confirmar que esto funciona para mí en Chrome (v18.0), Firefox (v11.0), IE (v9.08) y Safari (v5.1.5). ) usando jQuery (v1.7.2).

Estoy intentando extraer un feed de WordPress donde el contenido se llama <content:encoded> y esto es lo que funcionó para mí:

content: $this.find("content\\:encoded, encoded").text()
Fasani avatar May 07 '2012 20:05 Fasani

Si está utilizando jquery 1.5, tendrá que agregar comillas alrededor del valor del atributo del selector de nodo para que funcione:

.find('[nodeName="z:row"]')
s0laris avatar Mar 12 '2011 01:03 s0laris

Aunque la respuesta anterior parece correcta, no funciona en navegadores webkit (Safari, Chrome). Una mejor solución creo que sería:

.find("[nodeName=z:myRow, myRow]")    
Rich avatar Dec 14 '2009 16:12 Rich