gpt4 book ai didi

javascript - getAttributeNS 的行为是什么?

转载 作者:数据小太阳 更新时间:2023-10-29 02:04:05 29 4
gpt4 key购买 nike

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

<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 应该返回值romeo@example.com

[更新] 问题是(或者是)我对 namespace 与 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');

};
};

最佳答案

重要的是 attributes don't get the namespace until you explicitly prefix them with it :

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

这与确实从父级继承默认 namespace 的元素不同,除非有自己的定义。话虽如此,您的属性没有命名空间,这就是 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 namespaces and attributes .

如果您只想使用命名空间感知方法,那么它应该(虽然不确定,可能是特定于实现的)适用于 null 命名空间。试试 getAttributeNS(null, "jid")。如果没有,您始终可以使用 hasAttributeNS() 解决它,然后才回退到 getAttributeNS()getAttribute().

关于javascript - getAttributeNS 的行为是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10665596/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com