2010-06-23 4 views
0

У меня возникла проблема с извлечением значений атрибутов через E4x в javascript.Javascript E4X: Как правильно перебрать атрибут XMLList?

Предположим, что список узлов 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; если я установил , значения вернутся правильно, но первое значение вернет undefined.

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

ТИА,

FK

+0

Я не уверен, что здесь происходит, но «имя» действительно является функцией, а не просто простой строкой? – Pointy

+0

Да, это -E4X странно и ведет себя по-другому, как вы ожидаете от обычного объекта DOM или JS. Этот пример отлично работает для меня, за исключением того, что он не ясен, где 'n' происходит из' node [n] .attributes() '. Конечно, если '// .. обрабатывать значения' изменяет атрибуты, существует потенциальная проблема разрушительной итерации. – bobince

+0

Вышеупомянутый псевдокод. Мое использование (функция разбора JS xml в Rhino, используемое в классе Java) намного сложнее, поэтому я отвлек эту проблему. Я должен был это сказать. Сожалею. – FK82

ответ

2

Ваш код работает для меня, кроме этих подводных камней, которые я уверен, что не существует в Вашем 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 [email protected]*) { 
    var name = attribute.name(); 
    var value = attribute.toString(); 
} 

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

+0

Спасибо за ваш ответ. Это псевдо-код, мой фактический xml действителен. Я считаю, что синтаксис 'for each in' недоступен в' Rhino' (поскольку он еще не включает JavaScript 1.6).Я использую E4X в JS-функции, вызванной из контекста Rhino. Вы использовали мой цикл for for? – FK82

+0

Я не тестировал его на Rhino, но я тестировал вашу версию цикла с изменениями, о которых я упоминал, - в основном, тот же самый код, который я вставил выше, в Firefox. – Anurag

+0

Хорошо, ошибка должна быть где-то в другом месте. Хорошо знать, что я не поддаюсь написанию базового синтаксиса. :-) Благодаря. – FK82

Смежные вопросы