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
相当大的文件。
感谢您的帮助。
如果 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"/>)
即使这不是一个真正的解决方案,我认为这可能会有所帮助。