Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript getAttributeNS的行为是什么?_Javascript_Xml_Html_Dom - Fatal编程技术网

Javascript getAttributeNS的行为是什么?

Javascript getAttributeNS的行为是什么?,javascript,xml,html,dom,Javascript,Xml,Html,Dom,我正在用JavaScript编写一个小程序,我想在其中解析以下小XML片段: <iq xmlns="jabber:client" other="attributes"> <query xmlns="jabber:iq:roster"> <item subscription="both" jid="romeo@example.com"></item> </query> </iq> 使用这段代码,我不会得到属性

我正在用JavaScript编写一个小程序,我想在其中解析以下小XML片段:

<iq xmlns="jabber:client" other="attributes">
  <query xmlns="jabber:iq:roster">
    <item subscription="both" jid="romeo@example.com"></item>
  </query>
</iq>
使用这段代码,我不会得到属性
jid
(我得到一个空字符串),但是当我使用
itemeelement.getAttribute('jid')
而不是
itemeelement.getAttributeNS('jabber:iq:花名册,'jid')
时,我得到了预期的结果

如何以名称空间感知的方式编写代码?在我对XML的理解中,属性
jid
的名称空间具有名称空间
jabber:iq:lotster
,因此函数
getAttributeNS
应该返回值
romeo@example.com

[更新]问题是(或是)我对名称空间与XML属性一起使用的理解,与DOM API无关。因此,我创建了另一个问题:。也因为不幸的是没有给我答案

[更新]我现在做的是,首先检查是否存在不带命名空间的属性,然后检查是否存在带命名空间的属性:

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

  };
};

重要的是:

默认名称空间声明适用于其范围内所有未固定的元素名称。默认命名空间声明不直接应用于属性名称

这与从父级继承默认名称空间的元素不同,除非定义了自己的名称空间。话虽如此,您的属性没有名称空间,这就是为什么
getAttribute()
有效,而带有名称空间值的
getAttributeNS()
无效的原因

您的源XML在“名称空间”属性中需要如下所示:

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


如果您只想使用名称空间感知方法,那么它应该(不确定,可能是特定于实现的)适用于
null
名称空间。尝试
getAttributeNS(null,“jid”)
。如果没有,您总是可以使用
hasAttributeNS()
来解决它,然后再回退到
getAttributeNS()
getattributes()

我没有使用XML名称空间的经验,但从我在demos online上看到的情况来看,第一个参数(代表XML名称空间)是一个URI。@ŠimeVidas名称空间“jabber:iq:花名册”是的规范中定义的正确URI。首先感谢您为我指出XML名称空间规范。我想我对XML属性中名称空间的理解是错误的(至少我现在感到困惑)。;-)但短语的含义是什么?对不固定属性的解释取决于它们出现的元素。是什么意思?我猜这意味着属性属于元素而不是名称空间。当然也有例外,比如
xml:lang
,但大多数属性仅在特定元素的上下文中才有意义。
<a:query xmlns:a="jabber:iq:roster">
    <a:item a:subscription="both" a:jid="romeo@example.com"></a:item>
</a:query>