使用带有 nodejs 的 libxmljs 的无效 XSD 架构

Ism*_*ael 3 node.js xsd-validation xliff libxml-js

我在 libxmljs 存储库上发布了一个问题,它被关闭了,因为他们认为这在 lib 级别不是问题。所以我把它贴在这里。

我正在尝试使用 OASIS 提供的 XML 模式验证 XLIFF 文件,但我一直收到 XSD 错误。

错误:Request._callback (/Users/fluxb0x/Tests/xliff_parser/main.js) 处的 Document.validate (/Users/fluxb0x/Tests/xliff_parser/node_modules/libxmljs/lib/document.js:73:17) 处的 XSD 架构无效:25:21) 在 Request.emit (events.js:98:17) 在 Request.emit (events.js:98:17) 在 Request.self.callback (/Users/fluxb0x/Tests/xliff_parser/node_modules/request/request.js:199:22)。(/Users/fluxb0x/Tests/xliff_parser/node_modules/request/request.js:1160:14) 在 IncomingMessage 的 Request.emit (events.js:117:20)。(/Users/fluxb0x/Tests/xliff_parser/node_modules/request/request.js:1111:12) at IncomingMessage.emit (events.js:117:20) at _stream_readable.js:938:16 at process._tickCallback (node. js:419:13)

我已经使用 Oxygen XML 编辑器来测试验证,它没有问题。

这是我导出的 XLIFF 文件:en.xliff

这是 OASIS 提供的 XSD 文件:xliff_schema.xsd

相当大的文件。

感谢您的帮助。

Lov*_*ler 7

如果 XSD 架构包含xsd:import具有文件系统相关schemaLocation属性的元素,则该libxmljs.parseXml()函数接受一个baseUrl可用于设置这些属性的选项。

const xsdDocument = libxmljs.parseXml(xsdString, { baseUrl: "/path/to/xsd/" });
Run Code Online (Sandbox Code Playgroud)

这避免了临时更改工作目录的需要。也要注意尾随的斜线。


小智 4

正如您在libxmljs bug tracker上指出的那样,libxmljs在使用导入另一个 XML 的架构文件验证 XML 时会引发错误。

<xsd:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="./xml.xsd"/>
Run Code Online (Sandbox Code Playgroud)

发生这种情况是因为 schemaLocation 中的相对路径是根据进程当前工作目录计算的。解决方法是在验证之前更改目录:

fs.readFile(schemaPath, { encoding: 'utf8' }, function (err, xsd) {
    if (err) cb (err);

    var cwd = process.cwd();
    process.chdir(path.dirname(schemaPath));

    var xsdDoc = libxml.parseXml(xsd);
    var xmlDoc = libxml.parseXml(content);

    var output = xmlDoc.validate(xsdDoc);
    process.chdir(cwd);

    cb(undefined, xmlDoc.validationErrors);
});
Run Code Online (Sandbox Code Playgroud)

我不确定如何libxml处理这个问题:也许引用的文件是同步加载的,我认为这是次优的。

此解决方法仅适用于本地文件,我不知道如何解决远程 schemaLocation 的情况,例如您的示例 ( schemaLocation="http://www.w3.org/2001/xml.xsd"/>)

即使这不是一个真正的解决方案,我认为这可能会有所帮助。