2009-06-20 11 views
16

Je les suivantes XML-jQuery XML Parsing/Traversant

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

Ce que je veux faire est de boucler chacun des d'une certaine ligne.

J'ai essayé de le faire afin d'obtenir tous les identifiants, mais j'ai également obtenu les valeurs ids.

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

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

Je voudrais également souligner que l'objectif principal est la boucle chaque attr et ensuite en boucle chaque valeur alors que j'ai l'id du attr. Si vous pensez à une manière plus facile/plus simple de le faire avec une autre bibliothèque, je suis ouvert aux suggestions.

Merci à l'avance,

+0

Avait juste à peu près ce même problème. +1 –

Répondre

14

Je ne comprends pas ce que vous essayez de boucle au-dessus, je pense que l'une des balises dans votre question a été tronquée. Vous dites: "Ce que je veux faire est de boucler chacune d'une certaine rangée." et je pense que vous avez une étiquette là-dedans. Quoi qu'il en soit, voici quelques exemples d'extraction de données à partir du document XML analysé en utilisant jQuery. Les commentaires montrent ce qui sera alerté.

Je pense qu'une partie du problème est que vous avez les valeurs id en tant que frères et sœurs plutôt que les enfants pour les attributs. Il apparaît comme une structure plus cohérente pourrait être:

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

Mais si vous n'avez pas de contrôle sur le xml, s'il vous plaît ignorer cette suggestion. :-)

Ok, voici quelques exemples de traversal pour obtenir diverses données:

D'abord nous allons obtenir juste « Item1 »

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

Maintenant, nous allons obtenir le 1 et le 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> 

et enfin, nous allons tirer les principaux ids attr et de les attacher dans les valeurs:

<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

Fondamentalement ce que je veux boucler est l'attrs, et pour chaque attr j'ai besoin de récupérer chacune de ses valeurs, et en plus de récupérer l'ID de l'attr, je ne peux pas changer le xml alors j'ai besoin d'une solution pour cela. Je vais essayer votre code demain quand j'aurai mon poste de travail, merci. –

1

Cela devrait fonctionner pour vous

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

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

PS. Vous pouvez utiliser xpath soit:

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

Cela ne fonctionne pas. –

+0

Édité. Désolé, je ne peux pas le tester ici. –