Javascript E4X:如何正确迭代属性XMLList?

时间:2010-06-23 13:08:23

标签: javascript iteration attributes undefined e4x

我在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
    }

现在,对于一个,名称和值没有充分返回值(n)返回name(n + 1)的值,即att1的值将是value2;如果我设置var value = attributes[ (n+1) ].toString(),则会正确返回值,但第一个值将返回undefined

可能我只是密集在这一个。那么,有没有人对我所缺少的东西有任何指示?

TIA,

FK

1 个答案:

答案 0 :(得分:2)

您的代码对我有用,除了我确定在您的实际XML中不存在的这些问题,因为您能够解析并遍历它们:

  1. CDATA声明无效。已更改为<![CDATA[..]]>
  2. /* more node childs */使XML无效
  3. n替换为0,或者完全不使用
  4. 这是我用来迭代节点属性的确切代码。

    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

    即可