我有一个 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);
您是否特别需要使用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 的依赖。