Доступ к дочерним узлам XML DOM по имени

Я хочу получить доступ к свойству textContent объекта XML в JavaScript. Корневой элемент имеет несколько детей, которые также сами дети. Чтобы получить детей на первом уровне, я просто перебираю массив childNodes корневого элемента. Но чтобы получить значения "внуков", я хотел бы использовать что-то вроде getElementsByTagName(), которая не работает. В настоящее время я просто повторяю все дочерние элементы снова и проверяю свойство nodeName каждого, чтобы получить мои значения. Is есть способ получить дочерний объект по имени?

XML-код (обратите внимание: XML-документ, который я получаю внутренне, неформатирован, нет пробелов, нет #text узлы):

<root>
  <element>
    <child1>content</child1>
    <child2>content</child2>
    <child3>content</child3>
  </element>
  <element>
    <child1>content</child1>
    <child2>content</child2>
    <child3>content</child3>
  </element>
</root>

что я пробовал до сих пор:

xmlDoc = xmlhttp.responseXML;
for(i = 0; i < xmlDoc.documentElement.childNodes.length; i++)
{
  key = xmlDoc.documentElement.childNodes[i];
  alert(key.getElementsByTagName('child1')[0].textContent);
}

что приводит к в окне сообщения:undefined
и ошибка консоли:ошибку TypeError: ключ.метод getelementsbytagname(...) [0] is неопределено

Браузер: Firefox 26

возможно, это проблема с объектом DOM, я создаю его следующим образом:

var xmlhttp;
if (window.XMLHttpRequest)
{
  xmlhttp=new XMLHttpRequest();
}
xmlhttp.onreadystatechange=function()
{
  if(xmlhttp.readyState==4 && xmlhttp.status==200)
  {
    xmlDoc = xmlhttp.responseXML;

3 ответов


проблема в том, что пробелы между узлами автоматически становятся textNodes. Проверьте, находится ли узел в xmlDoc.documentElement.childNodes[i] это textNode (типа 3), прежде чем пытаться найти детей. Я также удалил ваши globals i и key в этом примере.

http://jsfiddle.net/GQ8Kd/

var node, childNodes = xmlDoc.documentElement.childNodes;
for(var i = 0; i < childNodes.length; i++)
{
  node = childNodes[i];
  if(node.nodeType !== Node.TEXT_NODE) console.log(node.getElementsByTagName('child1')[0].textContent);
}

попробовать getElementsByTagName('child1')[0].nodeValue


используя следующее, получает желаемое значение дочерних узлов для меня..

var k = xmlDoc.getElementsByTagName("child1");

for(var i = 0; i < k.length; i++)
{
  console.log(k[i].childNodes[0].nodeValue);
}