首页 文章

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

提问于
浏览
1

我在libxmljs存储库上发布了一个问题并且它已关闭,因为他们认为这不是lib级别的问题 . 所以我在这里发布 .

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

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

我使用Oxygen XML编辑器测试验证,它没有问题 .

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

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

相当大的文件 .

感谢您的帮助 .

2 回答

  • 0

    如果XSD架构包含具有filesystem-relative schemaLocation 属性的 xsd:import 元素,则 libxmljs.parseXml() 函数接受 baseUrl 选项,该选项可用于设置这些属性的位置 .

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

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

  • 1

    正如您在libxmljs bug tracker上所述, libxmljs 在使用导入另一个的模式文件验证XML时会引发错误 .

    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="./xml.xsd"/>
    

    发生这种情况是因为schemaLocation中的相对路径是在进程当前工作目录上计算的 . workaround 正在验证之前更改目录:

    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);
    });
    

    我不确定 libxml 如何处理这个:也许引用的文件是同步加载的,我想这是次优的 .

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

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

相关问题