【问题标题】:How to get XML Attributes with XPath in JSDOM如何在 JSDOM 中使用 XPath 获取 XML 属性
【发布时间】: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

评估结果似乎是空的。

【问题讨论】:

    标签: javascript node.js xml xpath jsdom


    【解决方案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("")
      猜你喜欢
      • 2021-10-04
      • 1970-01-01
      • 2015-12-23
      • 1970-01-01
      • 2015-12-16
      • 1970-01-01
      • 1970-01-01
      • 2011-05-30
      • 2019-10-02
      相关资源
      最近更新 更多