2010-06-23 19 views
0

J'ai un problème avec la récupération des valeurs d'attribut via E4x en javascript.Javascript E4X: Comment parcourir correctement un attribut XMLList?

Supposons une liste de noeuds XML comme ce qui suit comme le XMLObject:

<node att1="value1" att2="value2" att3="value3" att4="value4"> 
    <nodeChild><!CDATA[/* ... */]></nodeChild> 
    /* more node childs */ 
</node> 

I correctement accédé aux nœuds (dans une boucle) et son attribut noeuds en utilisant la méthode attributes():

var attributes = node[n].attributes() ; 
    for(var n = 0 ; n < attributes.length() ; n++) { 
     var name = attributes[n].name() ; 
     var value = attributes[n].toString() ; 
     //.. handle the values 
    } 

Maintenant, pour un, les noms et les valeurs ne sont pas retournés correctement la valeur (n) renvoie la valeur de nom (n + 1), à savoir la valeur de att1 sera value2; si je mets var value = attributes[ (n+1) ].toString() les valeurs sont retournées correctement mais la première valeur retournera undefined. Possible Je suis juste dense sur celui-ci. Alors, quelqu'un at-il des indications sur ce qui me manque?

TIA,

FK

+0

Je ne suis pas sûr de ce qui se passe ici, mais "nom" est-il vraiment une fonction, et pas seulement une simple chaîne? – Pointy

+0

Oui, c'est-E4X est bizarre et se comporte différemment de la façon dont vous attendez un objet DOM ou JS normal. L'exemple fonctionne bien pour moi, sauf qu'il n'est pas clair d'où vient le 'n' dans 'node [n] .attributes()'. Bien sûr, si // manipule les valeurs modifie les attributs, il y a potentiellement un problème d'itération destructrice. – bobince

+0

Ce qui précède est un pseudo-code. Mon cas d'utilisation (fonction d'analyse de xml JS dans Rhino utilisée dans une classe Java) est beaucoup plus complexe, j'ai donc résumé le problème. J'aurais dû le dire. Pardon. – FK82

Répondre

2

Votre code fonctionne pour moi, en dehors de ces pièges que je suis sûr n'existe pas dans votre XML réel puisque vous êtes en mesure d'analyser et itérer les:

  1. La déclaration CDATA n'était pas valide. Changé à <![CDATA[..]]>
  2. /* more node childs */ rend le XML non valide
  3. Remplacée n avec 0, ou pourrait le faire sans complètement

Voici le code exact j'itérer les attributs de nœud.

var node = <node att1="value1" att2="value2" att3="value3" att4="value4"> 
    <nodeChild><![CDATA[/* ... */]]></nodeChild> 
</node>; 

var attributes = node[0].attributes() ; 
for(var n = 0 ; n < attributes.length() ; n++) { 
    var name = attributes[n].name() ; 
    var value = attributes[n].toString() ; 
    console.log("%s = %s", name, value);  
} 

// log output 
// att1 = value1 
// att2 = value2 
// att3 = value3 
// att4 = value4 

Notez que E4X fournit une façon plus succincte d'écrire ce qui précède (combiné avec for each in introduit en JavaScript 1.6):

for each(var attribute in [email protected]*) { 
    var name = attribute.name(); 
    var value = attribute.toString(); 
} 

Puisque vous faites référence à un objet XML, il n'y a pas besoin de faire référence l'élément racine par l'indice comme dans node[0]. Vous pouvez simplement écrire node.

+0

Merci pour votre réponse. C'est du pseudo code, mon xml actuel est valide. Je crois que la syntaxe 'for each in' n'est pas disponible dans' Rhino' (car elle n'inclut pas encore JavaScript 1.6).J'utilise E4X dans une fonction JS appelée à partir d'un contexte Rhino. Avez-vous utilisé ma boucle for dans votre test? – FK82

+0

Je ne l'ai pas testé sur Rhino, mais j'ai testé votre version for loop avec les changements que j'ai mentionnés - en gros le même code que j'ai collé ci-dessus, sur Firefox. – Anurag

+0

D'accord, l'erreur doit être ailleurs. Bonne chose à savoir que je ne manque pas d'écrire la syntaxe de base. :-) Merci. – FK82