按名称访问 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)。在此示例中,我还删除了您的全局变量 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);
【讨论】:
嗨,我检查了节点类型,它是 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 子节点的主要内容,如果未能解决你的问题,请参考以下文章