Javascript E4X: Как правильно перебрать атрибут XMLList? - PullRequest
0 голосов
/ 23 июня 2010

У меня проблема с получением значений атрибутов через E4x в javascript.

Предположим, что список 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) возвращает значение имени (n + 1)т.е. значение att1 будет value2;если я установлю var value = attributes[ (n+1) ].toString(), то значения будут возвращены правильно, но первое значение вернет undefined.

Возможно, я просто плотно на этом.Итак, есть ли у кого-нибудь указатели на то, что мне не хватает?

TIA,

FK

1 Ответ

2 голосов
/ 23 июня 2010

Ваш код работает для меня, кроме этих ошибок, которые, я уверен, не существуют в вашем настоящем XML, так как вы можете анализировать и выполнять их итерацию:

  1. Объявление CDATA недействительно. Изменено на <![CDATA[..]]>
  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 предоставляет более сжатый способ написания вышеприведенного (в сочетании с for each in, введенным в JavaScript 1.6 ):

for each(var attribute in node.@*) {
    var name = attribute.name();
    var value = attribute.toString();
}

Поскольку вы ссылаетесь на объект XML, нет необходимости ссылаться на корневой элемент по индексу, как в node[0]. Вы можете просто написать node.

...