2011-01-16 7 views
2

Есть ли способ перебрать непосредственные дети узла XML в JavaScript, не используя jquery или подобную библиотеку? Я пытался использовать «.childNodes», но по какой-то причине он не работает должным образом. «.childNodes.length» возвращает число, которое обычно больше числа непосредственных узлов, и все имена тегов (с использованием .tagName) по какой-то причине не определены. Я знаю, что мои XML-данные формируются правильно, потому что, если я вызываю «.getElementsByTagName()», используя теги непосредственных детей, он работает так, как должен. Некоторые примеры моей дилеммой:JavaScript XML Parsing

var root = xmlData.getElementsByTagName("library_geometries")[0]; 

for (i = 0; i < root.childNodes.length; i++) //get all the geometries 
{ 
geom = root.childNodes[i]; 
alert(geom.tagName); 
} 

------------------------------------------------------ 
geom = root.getElementsByTagName("geometry"); 

for (i = 0; i < geom.length; i++) //get all the geometries 
{ 
alert(geom[i].tagName); 
} 

Первый один не работает вообще, второй один работает в этом примере.

+0

Если бы это произошло со мной, я бы хотел сначала проверить атрибут nodeType. Возможно, есть смешанные узлы CDATA (текст)? – Pointy

+0

Ой, это не совсем о разборе XML, так как, если вы пересекаете DOM, что-то уже разобрало его (браузер, предположительно). – Pointy

+0

полностью согласен с @Pointy .. вместо использования JS XML-анализатора? (т. е. sarissa ... http://dev.abiss.gr/sarissa/) – stecb

ответ

3

Это на самом деле является выяснение ответа HEMLOCK в. Я помещаю его здесь, а не комментируя его ответ, потому что у меня нет места для рисования довольно ASCII-произведений в комментариях.

Допустим, мы имеем следующий XML:

<a><b></b><c></c></a> 

Это создает следующий DOM:

<a>--. 
    | 
    <b> 
    | 
    <c> 

, который, как правило, то, что вы ожидали бы.

Допустим, мы теперь имеем следующий XML:

<a> 
    <b></b> 
    <c></c> 
</a> 

Вы думали бы это порождает тот же DOM. Но, согласно стандарту, вы ошибаетесь. Вместо этого, стандарт требует, чтобы его произвести следующие DOM:

<a>--. 
    | 
    "\n " 
    | 
    <b> 
    | 
    "\n " 
    | 
    <c> 
    | 
    "\n" 

Да, спецификация говорит, что все те пробелы должны быть захвачены в DOM. Почти все реализации XML там делают это (не только в браузерах). Единственное исключение - это IE (и расширение XML-движок в JScript), потому что Microsoft не заботилась о нарушении стандартов.

Лично это бесполезно 99,999% времени. Единственный раз, когда это было бы полезно, это если вы пытаетесь реализовать редактор XML-кода. Но это в стандартах, поэтому браузеру необходимо реализовать его, если они хотят соответствовать стандартам.

+0

У меня смешанные чувства по поводу результата этого. – Hemlock

0

Подождите, пока документ html не будет проанализирован. Вы должны запустить этот кусок скрипта, когда документ готов, в onload() документ еще не разобран, так что возможно, вы не найдете теги.

2

Вы получаете текстовые узлы (nodeType == 3), смешанные с элементами. Текстовые узлы, вероятно, содержат только пробел. Вы просто хотите отфильтровать свой цикл на nodeType (как сказал Уокей).

var root = xmlData.getElementsByTagName("library_geometries")[0]; 

for (i = 0; i < root.childNodes.length; i++) //get all the geometries 
{ 
geom = root.childNodes[i]; 
if (geom.nodeType == 1) { 
    alert(geom.tagName); 
} 
} 

https://developer.mozilla.org/en/nodeType

+0

nodeType решил мою проблему благодаря! – Dchris