如何使用saxonjs和nodejs获取xml文件中的变量

问题描述 投票:0回答:1

我有一个 xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE agent SYSTEM "http://www.someUrl.com">
<myData>
   <service>
      <description>Description</description>
   </service>
   <courier>
      <listener port="55556"
                />
      <mainService
      name="Some Name"
      port="55555"
      />
   </courier>
</myData>

我想使用nodejs获取监听器端口变量的值。 根据 SaxonJs 的文档 SaxonJS.XPath.evaluate 是我需要的方法。它需要一个查询和一个文档节点对象。当我将 xml 文件转换为 dom 对象时,我收到错误消息:“Uncaught TypeError TypeError:无法读取未定义的属性(读取“长度”)”

const saxonJs = require('saxon-js');
const fs      = require('node:fs');
const jsdom = require("jsdom");

var xmlFile   = fs.readFileSync(xmlFilePath, 'utf8');

var doc = new jsdom.JSDOM(xml);
var xpathQuery  = '//listener/@port';
var result      = saxonJs.XPath.evaluate(xpathQuery, doc);
javascript node.js xml jsdom saxon-js
1个回答
1
投票

您是否特别需要使用XPath?由于您有 JSDOM,我只需使用 CSS 选择器进行查询:

import {JSDOM} from "jsdom"; // ^24.0.0

const xml = `<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE agent SYSTEM "http://www.someUrl.com">
<myData>
   <service>
      <description>Description</description>
   </service>
   <courier>
      <listener port="55556"
                />
      <mainService
      name="Some Name"
      port="55555"
      />
   </courier>
</myData>`;

const dom = new JSDOM(xml, {contentType: "application/xml"});
const {document} = dom.window;
const port = document.querySelector("listener").getAttribute("port");
console.log(port); // => 55556

如果您确实想使用 XPath,可以在 JSDOM 中执行(请注意

[@port]
更改为按
listener
元素上的属性进行选择):

const port = document
  .evaluate(
    "//listener[@port]",
    document,
    null,
    9, // FIRST_ORDERED_NODE_TYPE
  )
  .singleNodeValue
  .getAttribute("port");

或直接选择属性字符串值:

const port = document
  .evaluate(
    "//listener/@port",
    document,
    null,
    2, // STRING_TYPE
  )
  .stringValue;

在撰写本文时,JSDOM 每周下载量为 22,000,000 次,而 saxon-js 为 20,000 次。如果可能的话,我会避免对 saxon-js 的依赖。

© www.soinside.com 2019 - 2024. All rights reserved.