Como faço para mudar o “nível” de validação que tarefa XMLValidate de Ant fornece?
Pergunta
Eu estou tentando usar tarefa XMLValidate do Ant para validar um documento XML contra um DTD. O problema não é que ele não funciona, mas que ele funciona muito bem. Meu DTD contém um elemento xref com um atributo "@linkend" do tipo IDREF. A maioria destes IDs de referência fora do documento atual. Devido a isso, a minha compilação falhar, uma vez que o analisador se queixa de que o ID que o IDREF faz referência não existe. Então, há alguma maneira que eu posso validar o meu documento XML contra o DTD, mas ignorar erros deste tipo?
Algumas coisas que eu tentei: Definir a opção "branda" na XMLValidate torna a tarefa verificar apenas boa formação do documento, e não a sua validade contra um DTD. A tarefa XMLValidate nas listas manual do Ant algumas opções JAXP e SAX você pode definir , mas nenhum parece aplicável.
Aqui está o meu código:
<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>
Como você pode ver, eu estou usando ResolvingXMLReader para resolver o DTD contra um catálogo de identificadores públicas. No entanto, eu obter o mesmo comportamento se eu especificar o DTD diretamente usando um elemento xmlcatalog aninhada.
Solução
Seus deriva problema a partir da diferença entre duas interpretações da DTD: o seu, e o da especificação :-). IDREFS deve se referir a ids no mesmo documento, ao passo que o seu referem-se a elementos em documentos.
A minha sugestão é criar sua própria versão da DTD que especifica NmToken vez de IDREF para esse atributo, e usá-lo para realizar sua validação. Isso irá garantir que o conteúdo será valores xml de identificação válido.
Outras dicas
Não sei se isso ajuda, mas você pode tentar esta solução alternativa? Criar um arquivo temporário, juntar todas as suas XMLs e fazer a validação.