2012-05-19 3 views
2

Я пишу небольшую программу в 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'); 

    }; 
}; 
+0

У меня нет опыта работы с пространствами имен XML, но из того, что я вижу из демонстраций в Интернете, первым аргументом (который представляет пространство имен XML) является URI. –

+1

@ ŠimeVidas Пространство имен «jabber: iq: roster» - это правильный URI, определенный в спецификациях [XMPP] (http://xmpp.org/rfcs/rfc6121.html#roster-syntax-actions-get). –

ответ

5

Важно то, что 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

Это не похоже на элементам, которые наследуют пространство имен по умолчанию от родителя, если не имеют собственных ограничений. С учетом сказанного, ваши атрибуты не заменяются именами, и поэтому getAttribute() работает и getAttributeNS() с пространством имен.

Ваш источник XML должен был бы выглядеть так, чтобы это «пространство имен» атрибута:

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

Вот некоторые больше на эту тему: XML namespaces and attributes.

Если вы хотите использовать только методы, ориентированные на пространство имен, то он должен (не уверен, хотя и может быть специфичным для реализации) работать для вас с пространством имен null. Попробуйте getAttributeNS(null, "jid"). Если это не так, вы всегда можете обойти его с помощью hasAttributeNS() и только затем вернуться к getAttributeNS() или getAttribute().

+0

Первое спасибо, указав мне спецификацию для ** Пространства имен в XML **. Я предполагаю, что мое понимание пространств имен в атрибутах XML было неправильным (по крайней мере, я сейчас запутался). ;-) Но какова фраза _ интерпретация неподписанных атрибутов определяется элементом, на котором они появляются. –

+0

Я предполагаю, что это означает, что атрибуты принадлежат элементу, а не пространству имен.Конечно, есть исключения, например, как 'xml: lang', но большинство атрибутов имеет смысл только в контексте конкретного элемента. –

Смежные вопросы