2009-06-20 14 views
16

Tengo el siguiente XMLjQuery análisis XML/Atravesando

<rows> 
    <row id="5"> 
     <cell>Item1</cell> 
    <attrs> 
    <attr> 
     <id>1</id> 
     <type>CheckBox</type> 
     <values> 
     <value> 
      <id>10</id> 
     </value> 
     <value> 
      <id>11</id> 
     </value> 
     </values> 
    </attr> 
    <attr> 
     <id>2</id> 
     <type>CheckBox</type> 
     <values> 
     <value> 
      <id>20</id> 
     </value> 
     <value> 
      <id>21</id> 
     </value> 
     </values> 
    </attr> 
    </attrs> 
    </row> 
</rows> 

Lo que quiero hacer es bucle de cada uno de los de una determinada fila.

Intenté hacer esto para obtener todos los atributos, pero también obtuve los ID de valores.

function fillForm(id){ 
    var theRow = $(theXmlDoc).find('row[id='+id+']').get() 

    $(theRow).find("attr").each(function(i) 
    { 
     alert($(this).find("id").text()); 
    }); 
} 

También me gustaría señalar que es objetivo principal de bucle cada attr y después para cada valor de bucle mientras tenga el id del attr.

P.S si piensa en una manera más fácil/más simple de hacerlo con alguna otra biblioteca, estoy abierto para recibir sugerencias.

Gracias de antemano,

+0

Estaba teniendo casi este mismo problema. +1 –

Respuesta

14

No me queda claro lo que estás tratando de reproducir indefinidamente, creo que una de las etiquetas en su pregunta era ilegible. Usted dice: "Lo que quiero hacer es repetir cada una de las filas". y creo que tenías una etiqueta allí.

De todos modos, aquí hay algunos ejemplos de extracción de datos del documento xml analizado utilizando jQuery. Los comentarios muestran lo que se alertará.

Creo que parte del problema es que tiene los valores de id como hermanos en lugar de hijos para los atributos. Parece una estructura más coherente podría ser:

<rows> 
    <row id="5"> 
     <cell>Item1</cell> 
     <attrs> 
      <attr id="1"> 
       <type>CheckBox</type> 
       <values> 
        <value> 
         <id>10</id> 
        </value> 
        <value> 
         <id>11</id> 
        </value> 
       </values> 
      </attr> 
      <attr id="2"> 
       <type>CheckBox</type> 
       <values> 
        <value> 
         <id>20</id> 
        </value> 
        <value> 
         <id>21</id> 
        </value> 
       </values> 
      </attr> 
     </attrs> 
    </row> 
</rows> 

Pero si usted no tiene control sobre el xml, por favor, ignora esa sugerencia. :-)

bien, aquí están algunas muestras de recorrido para conseguir varias piezas de datos:

En primer lugar vamos a conseguir "Elemento1"

<script type="text/javascript"> 
// Item1 
$.get('sample.xml', null, function (data, textStatus) { 
    alert($(data).find('rows row[id=5] cell').text()); 
}, 'xml'); 
</script> 

Ahora vamos a llegar el 1 y el 2 :

<script type="text/javascript"> 
// 1 
// 2 
$.get('sample.xml', null, function (data, textStatus) { 
    $(data).find('rows row[id=5] attrs attr > id').each(function(){ 
      alert($(this).text()); // 1, 2 
    }); 
}, 'xml'); 
</script> 

y, por último, vamos a tirar de los principales identificadores de attr y atarlos en los valores:

<script type="text/javascript"> 
// rows row[id=5] attrs attr > id 1 has inner ids of 10,11 
// rows row[id=5] attrs attr > id 2 has inner ids of 20,21 
$.get('sample.xml', null, function (data, textStatus) { 

     var out = '' 
     $(data).find('rows row[id=5] attrs attr > id').each(function(){ 
       out += 'rows row[id=5] attrs attr > id ' + $(this).text(); 
       var innerIds = []; 
       $(this).siblings('values').find('value id').each(function(){ 
        innerIds.push($(this).text()) 
       }); 
       out += ' has inner Ids of ' + innerIds.join(',') + '\n'; 
     }); 
     alert(out); 
    }, 'xml'); 
</script> 
+0

Básicamente, lo que quiero repetir son los atributos, y para cada attr necesito buscar cada uno de sus valores, y además de obtener la ID de Attr, no puedo cambiar el XML, así que necesito una solución para eso. Voy a probar tu código mañana cuando tenga mi estación de trabajo, gracias. –

1

Esto debería funcionar para usted

function fillForm(id){ 
    var row = $(theXmlDoc).find('row#+'+ id); 
    var ids = row.find("attr > id"); 

    ids.each(function(i) 
    { 
     alert($(this).text()); 
    }); 
} 

PS. Puede utilizar cualquiera xpath:

var ids = document.evaluate('//rows/row[@id='+id + ']/attr/id/text()', theXmlDoc, null, XPathResult.ANY_TYPE, null); 
+0

No funciona. –

+0

Editado. Lo siento, no puedo probarlo aquí. –