如何从嵌套XML中获取所有符合条件的Item No属性值
问题:获取所有符合条件的Item元素No属性值
需要从给定的嵌套XML结构中,获取所有包含Id为"3"的Detail子节点的Item元素的No属性值。当前代码仅返回第一个符合条件的"0001",无法获取同样符合条件的"0002",需修改代码返回全部结果。
XML结构
<xml> <Items> <Item No="0001"> <Details> <Detail Id="3"> <Colors> <Color colorName="green" /> <Color colorName="yellow" /> </Colors> </Detail> </Details> </Item> <Item No="0002"> <Details> <Detail Id="3"> <Colors> <Color colorName="purple" /> <Color colorName="pink" /> </Colors> </Detail> <Detail Id="6"> <Colors> <Color colorName="grey" /> <Color colorName="orange" /> </Colors> </Detail> </Details> </Item> <Item No="0003"> <Details> <Detail Id="8"> <Colors> <Color colorName="red" /> </Colors> </Detail> </Details> </Item> </Items> </xml>
现有代码
const search_id = "3" const foundNo = [] let ans= xmlDoc.evaluate(`//Item[Details/Detail/@Id="${search_id}"]/@No`, xmlDoc.documentElement); const foundNode = ans.iterateNext(); foundNo = foundNode.textContent // 仅返回Item No "0001"
修改方案
原代码仅调用了一次iterateNext(),只能获取第一个匹配节点。要拿到所有结果,需要循环调用iterateNext()直到返回null,将每个节点的内容收集到数组中:
修改后的代码
const search_id = "3"; const foundNo = []; const xpathResult = xmlDoc.evaluate(`//Item[Details/Detail/@Id="${search_id}"]/@No`, xmlDoc.documentElement); let currentNode; // 循环遍历所有匹配节点 while ((currentNode = xpathResult.iterateNext()) !== null) { foundNo.push(currentNode.textContent); } // 此时foundNo数组包含所有符合条件的No值:["0001", "0002"] console.log(foundNo);
说明
evaluate()返回的是XPathResult对象,iterateNext()每次调用返回下一个匹配节点,没有更多节点时返回null。- 通过
while循环遍历所有节点,将每个节点的textContent(即No属性的值)推入foundNo数组,最终得到所有符合条件的结果。
内容的提问来源于stack exchange,提问作者Sarahrb
相关产品推荐
相关产品推荐

