按名称访问 XML DOM 子节点

Posted

技术标签:

【中文标题】按名称访问 XML DOM 子节点【英文标题】:Accessing XML DOM child nodes by name 【发布时间】:2014-02-19 20:50:56 【问题描述】:

我想在 javascript 中访问 XML 对象的 textContent 属性。根项目有几个孩子,他们自己也有一些孩子。为了让子级处于第一级,我只需遍历根元素的 childNodes 数组。但是要获得“孙子”的值,我想使用类似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);

这会导致一个消息框:undefined 和控制台错误:TypeError: key.getElementsByTagName(...)[0] is undefined

浏览器: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 的子节点... 对不起。我在项目中使用的 XML 未格式化(没有任何空格),因此没有“#text”节点。 【参考方案1】:

使用以下方法为我获取 child1 节点的所需值..

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

for(var i = 0; i < k.length; i++)

  console.log(k[i].childNodes[0].nodeValue);

【讨论】:

.nodeValue 属性始终未定义,我必须使用 .textContent 来获取节点值。除此之外,使用 hhildNodes 数组总是有效的。 @robin.koch。我再次简化了我的答案。我想知道为什么这个当前版本不适合你。我愿意听取您的反馈意见。【参考方案2】:

问题是节点之间的空格自动变成了textNodes。在尝试查找子节点之前,请检查 xmlDoc.documentElement.childNodes[i] 处的节点是否为 textNode(nodeType 3)。在此示例中,我还删除了您的全局变量 ikey

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

【讨论】:

嗨,我检查了节点类型,它是 1 ELEMENT_NODE 尝试在循环中添加console.log(node.nodeType);,你会看到你有2个文本节点 没有文本节点。输出全部为 1。将它与 nodeName 结合起来检查我是否遍历了正确的节点。如果我在 XML 文件中有空格,我知道有文本节点,但 xml 输出未格式化。它只是一行没有空格的文本。 你能更新我的小提琴吗?因为据我所知它工作正常 JFYI,这是 php 后端中的一个错误,我正在搜索的节点不是为第一个元素创建的 - 仅在我用于测试的情况下 - 这就是为什么我总是得到一个错误。不过,感谢您的帮助。【参考方案3】:

试试getElementsByTagName('child1')[0].nodeValue

【讨论】:

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

以上是关于按名称访问 XML DOM 子节点的主要内容,如果未能解决你的问题,请参考以下文章

jQuery DOM节点操作 - 父节点子节点兄弟节点

XML文件解析DOM解析和SAX解析

XML DOM – 访问节点概述

Js DOM对象

如何使用 XPATH for XML 获取子节点数

XML使用DOM操作