2009-06-20 11 views
16

Ho il seguente XMLjQuery XML di analisi/Movimento

<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> 

Quello che voglio fare è quello di ciclo ognuno dei di una certa fila.

Ho provato a fare questo per ottenere tutti gli id ​​attr, ma ho anche ottenuto i valori id.

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

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

Vorrei anche sottolineare che obiettivo principale è anello ogni attr e poi a ciclo ogni valore mentre ho id del attr.

P.S se si pensa ad un modo più semplice/più semplice per farlo con altre librerie, sono aperto a suggerimenti.

Grazie in anticipo,

+0

Avevo quasi esattamente lo stesso problema. +1 –

risposta

14

Non sto chiaro che cosa si sta cercando di ciclo finito, penso che uno dei tag nella tua domanda è stata confusa. Tu dici: "Quello che voglio fare è un ciclo di ciascuna di una certa riga". e penso che tu avessi un tag in là.

In ogni caso, ecco alcuni esempi di estrazione di dati dal documento xml analizzato usando jQuery. I commenti mostrano cosa verrà avvisato.

Penso che parte del problema sia che si abbiano i valori di id come fratelli piuttosto che come figli per gli attributi. Sembra una struttura più coerente potrebbe essere:

<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> 

Ma se non si ha il controllo del xml, ignora questo suggerimento. :-)

Ok, ecco alcuni esempi di attraversamento per ottenere i vari pezzi di dati:

Prima facciamo solo ottenere "Item1"

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

Ora avremo l'1 e il 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> 

e, infine, cerchiamo di tirare fuori le principali ids attr e legarli nei valori:

<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

Fondamentalmente quello che voglio ripetere è l'attrs, e per ogni attr ho bisogno di recuperare ognuno dei suoi valori, e oltre a recuperare l'id di attr, non posso cambiare l'xml quindi ho bisogno di una soluzione per questo. Proverò il tuo codice domani quando avrò la mia postazione di lavoro, grazie. –

1

Questo dovrebbe funzionare per voi

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

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

PS. È possibile utilizzare uno xpath:

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

Non funziona. –

+0

Modificato. Scusa, non posso testarlo qui. –