JAVA: Как использовать Xerces SAXParser, используя несколько схем с одинаковыми targetNamespaces - PullRequest
1 голос
/ 12 марта 2010

У меня есть требование выполнить некоторую проверку входящего фрагмента XML с использованием группы схем.

Все эти схемы совместно используют одно и то же targetNamespace, но разделены на разные файлы .xsd.

Моя java-программа загружает каждый xsd-файл в массив InputSource [] и передает их в SAX Parser (свойство SCHEMA_SOURCE). Однако при вызове метода XMLReader.parse я получаю следующую трассировку стека:

** java.lang.IllegalArgumentException: при использовании массива объектов в качестве значения свойства SCHEMA_SOURCE никакие две схемы не должны совместно использовать одно и то же targetNamespace. в org.apache.xerces.impl.xs.XMLSchemaLoader.processJAXPSchemaSource (неизвестный источник) в org.apache.xerces.impl.xs.XMLSchemaLoader.loadSchema (Неизвестный источник) в org.apache.xerces.impl.xs.XMLSchemaValidator.findSchemaGrammar (неизвестный источник) в org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement (неизвестный источник) в org.apache.xerces.impl.xs.XMLSchemaValidator.startElement (неизвестный источник) в org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement (неизвестный источник) at org.apache.xerces.impl.XMLNSDocumentScannerImpl $ NSContentDispatcher.scanRootElementHook (неизвестный источник) at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl $ FragmentContentDispatcher.dispatch (неизвестный источник) в org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument (неизвестный источник) в org.apache.xerces.parsers.XML11Configuration.parse (неизвестный источник) в org.apache.xerces.parsers.XML11Configuration.parse (неизвестный источник) в org.apache.xerces.parsers.XMLParser.parse (Неизвестный источник) at org.apache.xerces.parsers.AbstractSAXParser.parse (Неизвестный источник) **

Мне нужно проанализировать XML, используя схемы, которые совместно используют пространство имен. Можно ли это сделать и избежать вышеуказанной ошибки?

Любая форма помощи или совета будет оценена

Спасибо

1 Ответ

0 голосов
/ 15 февраля 2012

Нет, это невозможно. Это обеспечивается XML и спецификацией схемы .

Сущность или атрибут могут быть связаны только с одним пространством имен, либо неявным по умолчанию, либо явным пространством имен в качестве префикса.

Совет: если ваш XML-ввод правильно сформирован, но не может быть проверен, потому что пространства имен не объявлены, но у вас есть идея, как реализовать логику, которая может угадать , что такое пространство имен для каждого узла в его контексте, как его предыдущий узел или его родительский узел. Вы можете создать препроцессор:

  • анализирует входные узлы XML как DOM (или даже с SAXParser) без проверки схемы
  • применять такую ​​логику и предварительно ожидаемые объекты и / или атрибуты с угаданными пространствами имен
  • снова выводится как XML; на этом этапе вы можете дополнительно использовать симпатичный форматер для отладки
  • теперь внедрить этот вывод в существующий анализатор с проверкой схемы
...