2008-10-04 3 views
0

Я пытаюсь использовать задачу XMLValidate Ant для проверки XML-документа на DTD. Проблема заключается не в том, что она не работает, а в том, что она работает слишком хорошо. Мой DTD содержит элемент xref с атрибутом «@linkend» типа IDREF. Большинство этих идентификаторов ссылок за пределами текущего документа. Из-за этого моя сборка не выполняется, поскольку парсер жалуется, что идентификатор, который IDREF ссылается, не существует. Итак, есть ли способ подтвердить мой XML-документ против DTD, но игнорировать ошибки этого типа?Как изменить «уровень» проверки, который предоставляет задача AntValidate XMLValidate?

Несколько вещей, которые я пробовал: установка опции «lenient» в XMLValidate делает задачу только проверкой корректности документа, а не его действительностью против DTD. The XMLValidate task in the Ant manual перечисляет некоторые параметры JAXP и SAX, которые вы можете установить, но ни один из них не подходит.

Вот мой код:

<target name="validate"> 
     <echo message="Validating ${input}"/> 
     <xmlvalidate file="${input}" failonerror="yes" 
      classname="org.apache.xml.resolver.tools.ResolvingXMLReader"> 
      <classpath refid="xslt.processor.classpath"/> 
     </xmlvalidate> 
</target> 

Как вы можете видеть, я использую ResolvingXMLReader разрешить DTD против каталога публичных идентификаторов. Тем не менее, я получаю такое же поведение, если я задаю DTD напрямую, используя вложенный элемент xmlcatalog.

ответ

2

Ваша проблема проистекает из разницы между двумя интерпретациями DTD: yours и spec's :-). IDREF должны ссылаться на идентификаторы в том же документе, а ваши - на элементы документов.

Мое предложение состоит в том, чтобы создать свою собственную версию DTD, которая указывает NMTOKEN вместо IDREF для этого атрибута и использовать его для выполнения вашей проверки. Это гарантирует, что содержимое будет иметь значения xml id.

+0

Хорошая точка. На самом деле это то, что я делал. –

0

Не уверен, что это поможет, но вы могли бы попробовать это обходное решение? Создайте временный файл, объедините все свои XML и выполните проверку.