使用JS解析XML:区分父元素不同的同名子元素
区分父元素不同的同名XML元素
针对你给出的XML结构——<Nm>元素分别隶属于<Dbtr>和<Cdtr>父节点,要区分这两个同名字段,核心思路是通过父节点的层级关系来限定查找范围,下面结合常见的XML解析方式给出具体实现:
1. DOM解析(以JavaScript为例)
DOM会把XML解析成树形结构,你可以先定位到目标父节点,再从父节点下提取<Nm>的内容:
// 假设已将XML加载到xmlDoc对象中 // 获取债务人名称 const debtorName = xmlDoc.getElementsByTagName("Dbtr")[0].getElementsByTagName("Nm")[0].textContent; // 获取债权人名称 const creditorName = xmlDoc.getElementsByTagName("Cdtr")[0].getElementsByTagName("Nm")[0].textContent; console.log("债务人:" + debtorName); // 输出 Debtor console.log("债权人:" + creditorName); // 输出 Creditor
这种方式先锁定<Dbtr>或<Cdtr>,再在其内部找<Nm>,完全不会混淆两个同名元素。
2. 用XPath精准定位
XPath可以直接通过层级路径表达式指定目标元素,写法更简洁:
// 假设已加载XML到xmlDoc对象 // 定义XPath路径 const debtorPath = "/Dbtr/Nm"; const creditorPath = "/Cdtr/Nm"; // 提取债务人名称 const debtorNode = xmlDoc.evaluate(debtorPath, xmlDoc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null); const debtorName = debtorNode.singleNodeValue.textContent; // 提取债权人名称 const creditorNode = xmlDoc.evaluate(creditorPath, xmlDoc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null); const creditorName = creditorNode.singleNodeValue.textContent;
XPath表达式/Dbtr/Nm直接指向根节点下<Dbtr>的子节点<Nm>,精准区分同名字段。
3. Python解析示例(xml.dom.minidom)
如果用Python处理,逻辑和上面一致:
from xml.dom.minidom import parseString xml_str = """ <root> <Dbtr> <Nm>Debtor</Nm> </Dbtr> <Cdtr> <Nm>Creditor</Nm> </Cdtr> </root> """ dom = parseString(xml_str) # 获取债务人名称 debtor_name = dom.getElementsByTagName("Dbtr")[0].getElementsByTagName("Nm")[0].firstChild.data # 获取债权人名称 creditor_name = dom.getElementsByTagName("Cdtr")[0].getElementsByTagName("Nm")[0].firstChild.data print(f"债务人:{debtor_name}") print(f"债权人:{creditor_name}")
内容的提问来源于stack exchange,提问作者NALL
相关产品推荐
相关产品推荐

