使用 JS 进行 XML 解析 - 区分 2 个同名但父级不同的元素

xml parsing with js - differentiating 2 elements with same name but different parent

提问人:NALL 提问时间:8/22/2023 更新时间:8/22/2023 访问量:22

问:

如果有 2 个同名但种类不同的元素,我们如何应用这个 xml 解析器示例? 例:

<Dbtr>
    <Nm>Debtor</Nm>
</Dbtr>
<Cdtr>
    <Nm>Creditor</Nm>
</Cdtr>

如何区分这两个名字?

JavaScript XML 解析

评论

0赞 Pointy 8/22/2023
“解析”不是正确的词;这就是 XML 解析器从 XML 源创建 DOM 所做的工作。通过构造的 DOM,您可以使用结构隐含标记内容含义的事实。使用 xpath 之类的东西,您可以通过结构中的路径选择内容。<Nm>
0赞 Ashish 8/22/2023
请在您提供的 w3schools 链接中尝试此脚本: <script> var parser, xmlDoc;var text = “<Dbtr>”+ “<Nm>债务人</Nm>”+ “</Dbtr>”+ “<Cdtr>”+ “<Nm>债权人</Nm>”+ “</Cdtr>”;解析器 = new DOMParser();const parsedDocument = parser.parseFromString( text, “text/html”);var allText = parsedDocument .all[0].getElementsByTagName('nm')[1].innerHTML;控制台.log(allText);</脚本>

答:

0赞 VLAZ 8/22/2023 #1

解析 XML1 后,选择器可以根据节点的父节点:

使用选择器

const xml = `
<root>
  <Dbtr>
      <Nm>Debtor</Nm>
  </Dbtr>
  <Cdtr>
      <Nm>Creditor</Nm>
  </Cdtr>
</root>
`;

const doc = new DOMParser().parseFromString(xml, "application/xml");

const debitor  = doc.querySelector("Dbtr > Nm").textContent;
const creditor = doc.querySelector("Cdtr > Nm").textContent;

console.log(debitor);
console.log(creditor);

查看更多:

使用 XPath

或者,XPath 可以以相同的方式使用:

const xml = `
<root>
  <Dbtr>
      <Nm>Debtor</Nm>
  </Dbtr>
  <Cdtr>
      <Nm>Creditor</Nm>
  </Cdtr>
</root>
`;

const doc = new DOMParser().parseFromString(xml, "application/xml");

const debitorNode = doc.evaluate(
  "//Dbtr/Nm",
  doc,
  null,
  XPathResult.FIRST_ORDERED_NODE_TYPE,
  null
).singleNodeValue;

const creditorNode = doc.evaluate(
  "//Cdtr/Nm",
  doc,
  null,
  XPathResult.FIRST_ORDERED_NODE_TYPE,
  null
).singleNodeValue

const debitor  = debitorNode.textContent;
const creditor = creditorNode.textContent;

console.log(debitor);
console.log(creditor);

查看更多:


1注意:XML 文档需要有一个顶级节点。

评论

0赞 NALL 8/22/2023
嗨,VLAZ。多谢。第一种选择似乎更容易。使用一个而不是另一个有什么优势吗?
0赞 VLAZ 8/22/2023
@NALL,您可以将 XPath 与它一起使用。因此,如果您有一些准备好的 XPath 代码片段,则可以运行它们。此外,还允许使用一些略有不同的方法来遍历 DOM,这些方法可能不适用于选择器。除此之外,它还允许对结果进行一些更复杂的处理。综上所述,在这种情况下,这可能是矫枉过正。这是一个有用的工具,所以我只是展示它的存在。我个人只会坚持使用选择器来做这样简单的事情。