Tob*_*zer 4 javascript xml html5 dom
我正在用JavaScript编写一个小程序,我要在其中解析以下小的XML片段:
<iq xmlns="jabber:client" other="attributes">
<query xmlns="jabber:iq:roster">
<item subscription="both" jid="romeo@example.com"></item>
</query>
</iq>
Run Code Online (Sandbox Code Playgroud)
因为我不知道,如果元素和属性有名称空间前缀,我正在使用名称空间感知函数(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');
};
};
Run Code Online (Sandbox Code Playgroud)
使用此代码,我没有得到属性的值jid(我得到一个空字符串),但是当我使用itemElement.getAttribute('jid')而不是itemElement.getAttributeNS('jabber:iq:roster', 'jid')我得到预期的结果.
如何以命名空间感知的方式编写代码?在我对XML的理解中,属性jid的命名空间具有命名空间jabber:iq:roster,因此函数getAttributeNS应该返回值romeo@example.com.
[更新]问题是(或者是)我对使用命名空间和XML属性的理解,并且与DOM API无关.因此,我创建了另一个问题:XML命名空间和未加前缀的属性.另外因为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');
};
};
Run Code Online (Sandbox Code Playgroud)
重要的是,在您明确地为它们添加前缀之前,属性不会获取命名空间:
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>
Run Code Online (Sandbox Code Playgroud)
以下是关于该主题的更多信息:XML命名空间和属性.
如果您只想使用名称空间感知方法,那么它应该(不确定,可能是特定于实现)对您使用null命名空间.试试getAttributeNS(null, "jid").如果没有,你可以随时解决它,hasAttributeNS()然后再回到getAttributeNS()或getAttribute().
| 归档时间: |
|
| 查看次数: |
1618 次 |
| 最近记录: |