如何在 JSDOM 中使用 XPath 获取 XML 属性

Posted

技术标签:

【中文标题】如何在 JSDOM 中使用 XPath 获取 XML 属性【英文标题】:How to get XML Attributes with XPath in JSDOM 【发布时间】:2021-12-31 23:08:33 【问题描述】:

我似乎无法在此 XML 片段上使用 JSDOM 和 XPath 语法获取 XML 属性。

<PARAGRAPH>
    This is a text, about something, that happened on 
    <DATE ISO="20131117">17.November 2013</DATE>
    . It is a very important date.
</PARAGRAPH>

据我了解,PARAGRAPH/DATE/@ISO 是该属性的有效 XPath 语法,并且在 Xpather 等网站上运行良好

最小的工作示例:

import  JSDOM  from "jsdom";

const xml = `
<PARAGRAPH>
    This is a text, about something, that happened on 
    <DATE ISO="20131117">17.November 2013</DATE>
    . It is a very important date.
</PARAGRAPH>
`;

const dom = new JSDOM(xml, contentType: "application/xml");
const doc = dom.window.document;

// 2: XPathResult.STRING_TYPE
const date = doc.evaluate("PARAGRAPH/DATE/@ISO", doc, null, 2, null).stringValue;

console.log(date);

预期结果: "20131117"

实际结果: ""

其他无效的方法

PARAGRAPH//DATE/@ISO, string(PARAGRAPH/DATE/@ISO), XPath.FIRST_ORDERED_NODE_TYPE

评估结果似乎是空的。

【问题讨论】:

【参考方案1】:

用 camaro 试试这个。在此处使用 runkit 进行测试https://runkit.com/embed/vxenbgqb1g7x

var  transform  = require("camaro")

var xml = `
<PARAGRAPH>
    This is a text, about something, that happened on 
    <DATE ISO="20131117">17.November 2013</DATE>
    . It is a very important date.
</PARAGRAPH>
`;

async function main() 
    console.log(await transform(xml, iso: 'PARAGRAPH/DATE/@ISO'))


main()

输出

iso: "20131117"

【讨论】:

【参考方案2】:

不妨试试

const dateEl = doc.evaluate("PARAGRAPH/DATE", doc, null, 9, null).singleNodeValue;

const date = dateEl.getAttribute("ISO");

【讨论】:

由于我使用的是 TS - 在 nodejs/JSDOM 的类型节点上没有定义 getAttribute。我现在正在使用dateEl["getAttribute"]("ISO"),但是在JSDOM.Node 类型之外调用函数并不是很优雅。 如果您想修复该库,请尝试在他们的 Github 网站上提出问题。我建议将上述方法作为以某种方式获取属性的解决方法,即使由于某些原因直接选择 XPath 似乎不起作用。至于类型问题,我不是很了解TypeScript,有没有办法将dateEl 转换为DOM Element 类型/接口(@98​​7654327@ 方法应该暴露在哪里)? 我为原始问题和 XPath @Attr 的实现打开了一个问题。 github.com/jsdom/jsdom/issues/3293您可以通过强制转换添加签名:(dateEl as Node &amp; Element).getAttribute("")

以上是关于如何在 JSDOM 中使用 XPath 获取 XML 属性的主要内容,如果未能解决你的问题,请参考以下文章

JSDOM获取子节点的一些方法

jsDOM学习

如何使用 jsdom、D3 和 IJavascript 在 Jupyter 笔记本中输出 SVG

如何在具有 xmlns 属性的 xml 中使用 xpath 获取特定的嵌套元素? [复制]

如何在 Java 中使用 XPath 从 XML 中获取特定节点?

如何在 xpath 中获取初始上下文位置和大小?