JavaScript解析XML:如何分组遍历多个points标签下的point坐标
问题说明
需要实现按points父标签分组遍历输出下属坐标:第一次循环输出第一个points下所有point的坐标值,第二次循环输出第二个points下的坐标,以此类推。
直接通过标签名选择所有point时可以正常拿到全部坐标值,但尝试按父标签分组遍历时控制台无输出,先后试过.eq()、:nth-child选择器都没有解决问题。
参考XML结构
<object> <coordinate>pixel</coordinate> <type>rectangle</type> <description>None</description> <possibleresult> <name>Intersection</name> </possibleresult> <points> <point>684.999939,182.999985</point> <point>682.568420,217.040604</point> <point>612.568420,212.040604</point> </points> </object>
原有代码问题
- 原生DOM的
getElementsByTagName方法不支持CSS风格的后代选择器语法,xml.getElementsByTagName("points point")本身无法匹配到任何元素,这是控制台无输出的核心原因 - 原有逻辑没有做两层遍历:先遍历所有
points父节点,再遍历单个父节点下的point子节点,直接跨层级选取所有point自然无法实现按父标签分组输出的需求
可运行修复代码
fetch("file.xml") .then(response => response.text()) .then(data => { const parser = new DOMParser(); const xml = parser.parseFromString(data, "application/xml"); // 第一步:拿到所有points父标签集合 const pointsGroups = xml.getElementsByTagName("points"); // 外层循环:逐个遍历每个points父标签 for (let i = 0; i < pointsGroups.length; i++) { console.log(`第${i+1}个points标签下的坐标:`); const currentPointsNode = pointsGroups[i]; // 第二步:拿到当前points标签下的所有point子标签 const pointNodes = currentPointsNode.getElementsByTagName("point"); // 内层循环:遍历当前父标签下的所有point坐标 for (let j = 0; j < pointNodes.length; j++) { const coordinate = pointNodes[j].textContent.trim(); console.log(coordinate); } } }) .catch(console.error);
如果要使用jQuery选择器实现,需要先把解析后的XML对象传入jQuery包装器再做层级选择,不能直接在全局上下文查找,否则会匹配失败。
内容的提问来源于stack exchange,提问作者anonym
相关产品推荐
相关产品推荐

