我在 JavaScript 中通过 E4x 检索属性值时遇到问题。
假设如下所示的 XML 节点列表作为 XMLObject:
<node att1="value1" att2="value2" att3="value3" att4="value4">
<nodeChild><!CDATA[/* ... */]></nodeChild>
/* more node childs */
</node>
我使用 attributes()
方法正确访问了节点(在循环中)及其属性节点:
var attributes = node[n].attributes() ;
for(var n = 0 ; n < attributes.length() ; n++) {
var name = attributes[n].name() ;
var value = attributes[n].toString() ;
//.. handle the values
}
现在,名称和值未充分返回 value(n) 返回 name(n+1) 的值,即 att1
的值将是 value2
;如果我设置 var value = attribute[ (n+1) ].toString() ,则值会正确返回,但第一个值将返回未定义。
可能我只是对这个很感兴趣。那么,有人能指出我所缺少的内容吗?
TIA,
FK
最佳答案
除了这些问题之外,你的代码对我有用,我确信这些问题在你的实际 XML 中不存在,因为你能够解析和迭代它们:
- CDATA 声明无效。更改为
<![CDATA[..]]>
-
/* more node childs */
使 XML 无效 - 已替换
n
与0
,或者完全没有它也可以
这是我用来迭代节点属性的确切代码。
var node = <node att1="value1" att2="value2" att3="value3" att4="value4">
<nodeChild><![CDATA[/* ... */]]></nodeChild>
</node>;
var attributes = node[0].attributes() ;
for(var n = 0 ; n < attributes.length() ; n++) {
var name = attributes[n].name() ;
var value = attributes[n].toString() ;
console.log("%s = %s", name, value);
}
// log output
// att1 = value1
// att2 = value2
// att3 = value3
// att4 = value4
请注意,E4X 提供了一种更简洁的方式来编写上述内容(结合 JavaScript 1.6 中引入的 for each in
):
for each(var attribute in node.@*) {
var name = attribute.name();
var value = attribute.toString();
}
由于您引用的是 XML 对象,因此无需像 node[0]
那样通过索引引用根元素。 。您可以简单地写node
.
关于JavaScript E4X : How do I properly iterate over an attribute XMLList?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3101852/