通过名称访问XML DOM子节点

6

我想在JavaScript中访问XML对象的textContent属性。根元素有几个子元素,这些子元素也有一些自己的子元素。为了获取第一层次的子元素,我只需遍历根元素的childNodes数组。但是要获取“grandchild”的值,我想使用类似于getElementsByTagName()的方法,但它不起作用。目前,我只是再次遍历所有子元素,并检查每个节点的nodeName属性以获取我的值。有没有一种方法可以通过名称获取子对象?

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

这导致一个消息框:未定义,以及一个控制台错误:TypeError:key.getElementsByTagName(...)[0]未定义

浏览器:Firefox 26

也许这是DOM对象的问题,我是以下方式创建它的:

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

你遇到的第一个子节点是文本节点,因此没有名为 child1 的任何子节点... - CBroe
很抱歉,我在项目中使用的XML是未格式化的(没有任何空格),因此没有“#text”节点。 - robin.koch
3个回答

3
问题在于节点间的空格自动转换成了textNode。在查找子节点之前,请检查xmlDoc.documentElement.childNodes[i]节点是否为textNode(nodeType 3)。我还在这个示例中删除了您的全局变量ikeyhttp://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);
}

嗨,我检查了节点类型,它是1 ELEMENT_NODE。 - robin.koch
尝试在循环中添加 console.log(node.nodeType);,你会发现你有2个文本节点。 - megawac
输出都是1。将其与nodeName结合使用以检查我是否遍历了正确的节点。如果XML文件中有空格,我知道那里有文本节点,但XML输出没有格式化。它只是一行没有空格的文本。 - robin.koch
你能否更新我的 Fiddle 以使其出现错误吗?因为据我所知它目前运行正常。 - megawac
顺便提一下,这是php后端的一个bug,我要查找的节点在第一个元素中没有被创建 - 只有在我用于测试的情况下 - 这就是为什么我总是会得到一个错误。不过,还是谢谢你的帮助。 - robin.koch

0
使用以下代码可以获取child1节点的所需值。
var k = xmlDoc.getElementsByTagName("child1");

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

.nodeValue属性始终为未定义,我必须使用.textContent来获取节点值。除此之外,使用childNodes数组总是有效的。 - robin.koch
@robin.koch。我又简化了我的答案。我想知道为什么这个版本对你不起作用。我很乐意听取您的反馈。 - Pineda

0
尝试使用 getElementsByTagName('child1')[0].nodeValue

这不起作用,因为key.getElementsByTagName('child1')[0]已经不存在了。 - robin.koch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接