【问题标题】:Javascript E4X: How do I properly iterate over an attribute XMLList?Javascript E4X:如何正确迭代属性 XMLList?
【发布时间】:2010-06-23 13:08:22
【问题描述】:

我在 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 = attributes[ (n+1) ].toString() 值会正确返回,但第一个值将返回undefined

可能我只是对这个很感兴趣。那么,有没有人指出我缺少什么?

TIA,

FK

【问题讨论】:

  • 我不确定这里发生了什么,但“name”真的是一个函数,而不仅仅是一个简单的字符串吗?
  • 是的,它是——E4X 很奇怪,并且与您期望的普通 DOM 或 JS 对象的行为方式不同。该示例对我来说很好,除了不清楚n 来自node[n].attributes() 的位置。当然,如果//.. handle the values 更改属性,则可能存在破坏性迭代问题。
  • 以上为伪代码。我的用例(Java 类中使用的 Rhino 中的 JS xml 解析函数)要复杂得多,所以我抽象了这个问题。我应该这么说的。对不起。
  • @Pointy:name() 是 E4X 中 XMLObject 的一种方法,它产生节点名称。在本例中为属性名称。
  • @bobince:我没有更改值。如果循环语法中没有明显的错误,则错误必须在代码中的其他位置。我会通过它并且——以防万一——将发布额外的代码。谢谢。

标签: javascript iteration attributes undefined e4x


【解决方案1】:

你的代码对我有用,除了这些我确定在你的实际 XML 中不存在的陷阱,因为你能够解析和迭代它们:

  1. CDATA 声明无效。改为&lt;![CDATA[..]]&gt;
  2. /* more node childs */ 使 XML 无效
  3. 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

【讨论】:

  • 感谢您的回答。这是伪代码,我的实际 xml 是有效的。我相信for each in 语法在Rhino 中不可用(因为它还不包括JavaScript 1.6)。我在从 Rhino 上下文调用的 JS 函数中使用 E4X。你在测试中使用了我的for loop 吗?
  • 我没有在 Rhino 上测试它,但我确实用我提到的更改测试了你的 for 循环版本 - 基本上与我在 Firefox 上粘贴的代码完全相同。
  • 好吧,那么错误一定是在其他地方。很高兴知道我在编写基本语法方面不会失败。 :-) 谢谢。
猜你喜欢
  • 2013-02-09
  • 1970-01-01
  • 1970-01-01
  • 2022-10-07
  • 2012-07-05
  • 2011-08-28
  • 1970-01-01
  • 2011-06-18
  • 2019-11-02
相关资源
最近更新 更多