Я пишу небольшую программу в JavaScript, в котором я хочу разобрать следующий маленький XML фрагмент кода:Каково поведение getAttributeNS?
<iq xmlns="jabber:client" other="attributes">
<query xmlns="jabber:iq:roster">
<item subscription="both" jid="[email protected]"></item>
</query>
</iq>
Потому что я не знаю, если элементы и атрибуты имеют префиксы пространства имен, я использую функции, поддерживающие пространство имен (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');
};
};
С помощью этого кода я не получаю значение атрибута jid
(я получаю пустую строку), но когда я использую itemElement.getAttribute('jid')
вместо itemElement.getAttributeNS('jabber:iq:roster', 'jid')
я получаю ожидаемый результат.
Как написать код в знании имен? В моем понимании XML пространство имен атрибута jid
имеет пространство имен jabber:iq:roster
, и поэтому функция getAttributeNS
должна вернуть значение [email protected]
.
[UPDATE] Проблема заключалась в (или) моем понимании использования пространств имен вместе с атрибутами XML и не связана с DOM API. Поэтому я задал другой вопрос: XML Namespaces and Unprefixed Attributes. Кроме того, потому что XML namespaces and attributes, к сожалению, не дает мне ответа.
[UPDATE] То, что я сейчас, сначала проверить, есть ли атрибут без имен, а затем, если он там с пространством имен:
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');
};
};
У меня нет опыта работы с пространствами имен XML, но из того, что я вижу из демонстраций в Интернете, первым аргументом (который представляет пространство имен XML) является URI. –
@ ŠimeVidas Пространство имен «jabber: iq: roster» - это правильный URI, определенный в спецификациях [XMPP] (http://xmpp.org/rfcs/rfc6121.html#roster-syntax-actions-get). –