2012-05-19 1 views
2

J'écris un petit programme en JavaScript que je veux analyser le petit extrait de code XML suivant:Quel est le comportement de getAttributeNS?

<iq xmlns="jabber:client" other="attributes"> 
    <query xmlns="jabber:iq:roster"> 
    <item subscription="both" jid="[email protected]"></item> 
    </query> 
</iq> 

Parce que je ne sais pas, si les éléments et attributs, des préfixes d'espaces de noms, j'utilise les fonctions connaissant l'espace de noms (getElementsByTagNameNS, getAttributeNS).

var queryElement = iq.getElementsByTagNameNS('jabber:iq:roster', 'query')[0]; 
if (queryElement) { 
    var itemElements = queryElement.getElementsByTagNameNS('jabber:iq:roster', 'item'); 
    for (var i = itemElements.length - 1; i >= 0; i--) { 
    var itemElement = itemElements[i]; 

    var jid = itemElement.getAttributeNS('jabber:iq:roster', 'jid'); 
    }; 
}; 

Avec ce code, je ne reçois pas la valeur de l'attribut jid (je reçois une chaîne vide), mais quand je l'utilise itemElement.getAttribute('jid') au lieu de itemElement.getAttributeNS('jabber:iq:roster', 'jid') que je suis obtenir le résultat attendu.

Comment écrire le code de manière contextuelle? Dans ma compréhension de XML, l'espace de noms de l'attribut jid a l'espace de noms jabber:iq:roster et par conséquent la fonction getAttributeNS doit renvoyer la valeur [email protected].

[MISE À JOUR] Le problème était (ou est) ma compréhension de l'utilisation des espaces de noms avec les attributs XML et n'est pas liée à l'API DOM. J'ai donc créé une autre question: XML Namespaces and Unprefixed Attributes. Aussi parce que XML namespaces and attributes ne me donne malheureusement pas de réponse.

[UPDATE] Ce que je l'ai fait maintenant, est d'abord vérifier s'il est l'attribut sans espace de noms et si elle est là avec un espace de noms:

var queryElement = iq.getElementsByTagNameNS('jabber:iq:roster', 'query')[0]; 
if (queryElement) { 
    var itemElements = queryElement.getElementsByTagNameNS('jabber:iq:roster', 'item'); 
    for (var i = itemElements.length - 1; i >= 0; i--) { 
    var itemElement = itemElements[i]; 

    var jid = itemElement.getAttribute('jid') || itemElement.getAttributeNS('jabber:iq:roster', 'jid'); 

    }; 
}; 
+0

Je n'ai aucune expérience avec les espaces de noms XML, mais d'après ce que je vois des démos en ligne, le premier argument (qui représente l'espace de noms XML) est un URI. –

+1

@ ŠimeVidas L'espace de noms 'jabber: iq: roster' est un URI correct défini dans les spécifications de [XMPP] (http://xmpp.org/rfcs/rfc6121.html#roster-syntax-actions-get). –

Répondre

5

L'important est que attributes don't get the namespace until you explicitly prefix them with it:

A default namespace declaration applies to all unprefixed element names within its scope. Default namespace declarations do not apply directly to attribute names

Ceci est différent des éléments qui héritent de l'espace de nom par défaut du parent sauf s'ils ont leur propre définition. Cela dit, vos attributs ne sont pas espacés et c'est pourquoi getAttribute() fonctionne et getAttributeNS() avec une valeur d'espace de noms ne fonctionne pas.

Votre source XML devrait ressembler à ceci à « espace de noms » l'attribut:

<a:query xmlns:a="jabber:iq:roster"> 
    <a:item a:subscription="both" a:jid="[email protected]"></a:item> 
</a:query> 

est ici un peu plus sur le sujet: XML namespaces and attributes. Si vous ne souhaitez utiliser que les méthodes prenant en compte l'espace de noms, il doit (ne pas être sûr que cela puisse être spécifique à l'implémentation) fonctionner avec l'espace de noms null. Essayez getAttributeNS(null, "jid"). Si ce n'est pas le cas, vous pouvez toujours contourner le problème avec le hasAttributeNS() et seulement un repli vers getAttributeNS() ou getAttribute().

+0

Tout d'abord merci de m'indiquer la spécification pour ** Namespaces en XML **. Je suppose que ma compréhension des espaces de noms dans les attributs XML était erronée (au moins, je suis confus maintenant). ;-) Mais que signifie l'expression de l'interprétation des attributs non préfixés par l'élément sur lequel ils apparaissent? –

+0

Je suppose que cela signifie que les attributs appartiennent à un élément plutôt qu'à un espace de noms. Il y a des exceptions, bien sûr, comme 'xml: lang' par exemple, mais la majorité des attributs n'a de sens que dans le contexte d'un élément particulier. –

Questions connexes