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');
};
};
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. –
@ Š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). –