Я хочу проверить документ XML на соответствие схеме XSD. Я использую libxmljs 0.33 с NodeJS 18. Я продолжаю получать эту ошибку:
Error: Invalid XSD schema
at createPDF (/root/workspace/app/apps/docapi/src/modules/generator/src/de/fwht-recovery-dip/index.ts:20:24)
at Object.<anonymous> (/root/workspace/app/apps/docapi/src/modules/generator/test/de.fwht-recovery-dip.test.ts:6:31)
at Promise.then.completed (/root/workspace/app/node_modules/jest-circus/build/utils.js:298:28)
at new Promise (<anonymous>)
at callAsyncCircusFn (/root/workspace/app/node_modules/jest-circus/build/utils.js:231:10)
at _callCircusTest (/root/workspace/app/node_modules/jest-circus/build/run.js:316:40)
at _runTest (/root/workspace/app/node_modules/jest-circus/build/run.js:252:3)
at _runTestsForDescribeBlock (/root/workspace/app/node_modules/jest-circus/build/run.js:126:9)
at _runTestsForDescribeBlock (/root/workspace/app/node_modules/jest-circus/build/run.js:121:9)
at run (/root/workspace/app/node_modules/jest-circus/build/run.js:71:3)
at runAndTransformResultsToJestFormat (/root/workspace/app/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
at jestAdapter (/root/workspace/app/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
at runTestInternal (/root/workspace/app/node_modules/jest-runner/build/runTest.js:367:16)
at runTest (/root/workspace/app/node_modules/jest-runner/build/runTest.js:444:34)
Это код, который я запускаю, чтобы получить эту ошибку:
const schemasRoot = path.join(__dirname, 'schemas');
const xsdSchema = fs.readFileSync(path.join(schemasRoot, 'dip_flattened.xsd'), 'utf-8');
const xmlDocument = fs.readFileSync(path.join(schemasRoot, 'schema-test.xml'), 'utf-8');
const schema = libxml.parseXmlString(xsdSchema);
const document = libxml.parseXmlString(xmlDocument);
console.info(schema.validate(document));
Я попробовал использовать тот же XSD в Oxygen XML, и он работает нормально.
Я поискал ошибку и столкнулся с этой проблемой. Там упоминались проблемы, связанные с импортом/включением других схем. Я полностью устранил эту проблему, объединив файлы XSD в один гигантский файл. Так что этого не могло быть.
Этот Gistсодержит схемы XML и XSD. Спасибо
@traynor, это потому, что я вызываю его из тестового файла, та же ошибка, когда я запускаю с помощью ts-node
Сведение схемы невозможно, если существует более одного целевого пространства имен: возможно, вы создали недопустимую схему. Не видя схемы, на которую он жалуется, сказать невозможно.
@MichaelKay Я столкнулся с этой проблемой и исправил ее, она не является ее причиной. На данный момент я использую инструмент командной строки xmllint и вызываю его с помощью child_process.exec, я ненавижу это, но не могу зацикливаться на этом навсегда.
Вы пытаетесь проанализировать строку, а это означает, что базовый URI не будет известен, а это означает, что невозможно будет разрешить какие-либо относительные URI в атрибутах href. Проверьте, позволяет ли API анализировать имя файла или URI или предоставлять базовый URI при анализе строки.
@MichaelKay Я попробовал это как с абсолютным путем, так и с baseUrl. Ничего не помогло.
«Ничего не получилось» никогда не будет хорошим подходом к делу. Определите одну вещь, которая не сработала, и опубликуйте достаточно информации, чтобы другие люди могли воспроизвести проблему.
@MichaelKay Спасибо за помощь, я понял, что это была глупая ошибка, я опубликовал это как ответ и принял. Спасибо!





Ошибка в моем коде довольно глупая и тривиальная: вам следует использовать метод вызова validate для XML, который вы хотите проверить, а не для схемы, схема должна быть параметром.
Извините за беспокойство.
Так и должно быть console.info(schema.validate(document));
стек ошибок, похоже, исходит от
jest-circus, средства запуска тестов.. возможно, его нужно перенастроить..