2014-10-10 6 views
0

libxmljs 저장소에 문제가 게시되었으며 lib 수준에서 문제가되지 않기 때문에 닫혔습니다. 그래서 나는 그것을 여기에 게시한다.nodejs와 함께 libxmljs를 사용하는 XSD 스키마가 올바르지 않음

OASIS에서 제공하는 XML 스키마로 XLIFF 파일의 유효성을 검사하려고하지만 XSD에서 오류가 계속 발생합니다.

Error: Invalid XSD schema at Document.validate (/Users/fluxb0x/Tests/xliff_parser/node_modules/libxmljs/lib/document.js:73:17) at Request._callback (/Users/fluxb0x/Tests/xliff_parser/main.js:25:21) at Request.self.callback (/Users/fluxb0x/Tests/xliff_parser/node_modules/request/request.js:199:22) at Request.emit (events.js:98:17) at Request. (/Users/fluxb0x/Tests/xliff_parser/node_modules/request/request.js:1160:14) at Request.emit (events.js:117:20) at IncomingMessage. (/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_schema.xsd

꽤 큰 파일 : en.xliff

이 OASIS가 제공하는 XSD 파일은 다음과 같습니다

나를 내 보낸 XLIFF 파일입니다.

도움 주셔서 감사합니다.

답변

0

libxmljs bug tracker에서 언급했듯이 libxmljs은 다른 스키마 파일을 가져 오는 스키마 파일로 XML의 유효성을 검사 할 때 오류가 발생합니다.

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

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

내가 libxml이 생각을 처리하는 방법을 모르겠어요.

이 해결 방법은 내가 당신의 예에서와 같은 원격의 schemaLocation의 경우에 해결하는 방법을 모른다, 로컬 파일입니다 (schemaLocation="http://www.w3.org/2001/xml.xsd"/>)

비록 그것이 내가이 도움이 될 생각 진정한 해결책이 아니라면 . XSD를 스키마 파일 시스템 상대 schemaLocation 속성 xsd:import 요소가 포함되어있는 경우

0

libxmljs.parseXml() 기능은 이들의 위치를 ​​설정하는 데 사용할 수있는 baseUrl 옵션을 받아들입니다.

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

이렇게하면 임시로 작업 디렉토리를 변경할 필요가 없습니다. 후행 슬래시도 조심하십시오.