我正在寫一個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]
。
[更新]問題是(或者是)我對命名空間與XML屬性一起使用的理解,並且與DOM API無關。因此,我創建了另一個問題:XML Namespaces and Unprefixed Attributes。也因爲XML namespaces and attributes不幸沒有給我一個答案。
[更新]我所做的現在,是先檢查是否有沒有命名空間的屬性,然後,如果它是有一個命名空間:
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'是在[XMPP](http://xmpp.org/rfcs/rfc6121.html#roster-syntax-actions-get)規範中定義的正確URI。 –