使用getElementsByTagName获取节点值时,如何避免尖括号导致文本捕获提前终止?
解决XML节点嵌套标签导致文本截断的问题
这个坑我之前踩过!你现在的问题是只提取了<ArticleTitle>节点下的第一个文本子节点,但里面的<i>是独立的元素节点,它的文本内容属于自己的子节点,所以直接取childNodes[0].nodeValue自然就只拿到了前面的部分。
两种可行的解决办法:
1. 用原生textContent属性(推荐)
现代浏览器都支持元素的textContent属性,它会自动收集当前元素及其所有子元素的文本内容,不需要手动遍历:
// 直接获取完整文本 const TheTitle = xmlDoc.getElementsByTagName("ArticleTitle")[i].textContent;
这样处理你的示例,就能得到完整的 "The Cat Sat on The Mat"。
2. 手动遍历所有子节点(兼容旧环境)
如果需要兼容一些非常老的浏览器,可以写一个辅助函数递归提取所有文本:
function extractFullText(element) { let fullText = ''; // 遍历元素的所有子节点 for (const node of element.childNodes) { // 文本节点直接追加内容 if (node.nodeType === Node.TEXT_NODE) { fullText += node.nodeValue; } // 元素节点递归提取子节点文本 else if (node.nodeType === Node.ELEMENT_NODE) { fullText += extractFullText(node); } } return fullText; } // 使用方式 const titleElement = xmlDoc.getElementsByTagName("ArticleTitle")[i]; const TheTitle = extractFullText(titleElement);
为什么原来的代码会截断?
你的<ArticleTitle>节点的子节点结构其实是这样的:
- 第1个节点:文本节点,内容为
"The Cat Sat on The " - 第2个节点:元素节点
<i>,它的子节点是文本节点"Mat"
你只取了childNodes[0],自然就漏掉了后面元素节点里的文本内容啦。
内容的提问来源于stack exchange,提问作者haz
相关产品推荐
相关产品推荐

