如何在 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
类型/接口(@987654327@ 方法应该暴露在哪里)?
我为原始问题和 XPath @Attr 的实现打开了一个问题。 github.com/jsdom/jsdom/issues/3293您可以通过强制转换添加签名:(dateEl as Node & Element).getAttribute("")
以上是关于如何在 JSDOM 中使用 XPath 获取 XML 属性的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 jsdom、D3 和 IJavascript 在 Jupyter 笔记本中输出 SVG
如何在具有 xmlns 属性的 xml 中使用 xpath 获取特定的嵌套元素? [复制]