Разбор XML JavaScript - PullRequest
       4

Разбор XML JavaScript

2 голосов
/ 17 января 2011

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

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);
}

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

Ответы [ 3 ]

3 голосов
/ 17 января 2011

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

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

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

Thisгенерирует следующий 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-кода.Но это в стандартах, поэтому браузеры должны реализовать его, если они хотят быть совместимыми со стандартами.

2 голосов
/ 17 января 2011

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

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 голосов
/ 17 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...