次の小さな XML スニペットを解析する JavaScript で小さなプログラムを作成しています。
<iq xmlns="jabber:client" other="attributes">
<query xmlns="jabber:iq:roster">
<item subscription="both" jid="romeo@example.com"></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
は value を返す必要がありますromeo@example.com
。
[更新] 問題は、名前空間と XML 属性の使用についての私の理解であり、DOM API とは関係ありません。そのため、別の質問を作成しました: XML Namespaces and Unprefixed Attributes。また、残念ながらXML の名前空間と属性からは答えが得られないためです。
[更新]私が今行ったことは、最初に名前空間のない属性があるかどうかを確認し、次に名前空間のある属性があるかどうかを確認することです:
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');
};
};