4

次の小さな XML スニペットを解析する JavaScript で小さなプログラムを作成しています。

<iq xmlns="jabber:client" other="attributes">
  <query xmlns="jabber:iq:roster">
    <item subscription="both" jid="romeo@example.com"></item>
  </query>
</iq>

要素と属性に名前空間プレフィックスがあるかどうかわからないので、名前空間を認識する関数 ( getElementsByTagNameNSgetAttributeNS) を使用しています。

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');

  };
};
4

1 に答える 1

6

重要なことは、明示的に接頭辞を付けるまで、属性は名前空間を取得しないことです:

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="romeo@example.com"></a:item>
</a:query>

XML名前空間と属性.

名前空間に対応したメソッドのみを使用したい場合は、名前空間で動作するはずです (ただし、実装固有である可能性があります) null。試してみてくださいgetAttributeNS(null, "jid")。そうでない場合は、 を使用していつでも回避できます。その後、またはhasAttributeNS()にフォールバックします。getAttributeNS()getAttribute()

于 2012-05-19T13:55:51.427 に答える