Доступ к дочерним узлам 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
в этом примере.
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);
}
используя следующее, получает желаемое значение дочерних узлов для меня..
var k = xmlDoc.getElementsByTagName("child1");
for(var i = 0; i < k.length; i++)
{
console.log(k[i].childNodes[0].nodeValue);
}