Validacao de XML

Criei um DTD para um documento XML, porem mesmo com o XML mal-formatado o processamento dele ocorre sem problemas. Nao sei se o problema eh com o meu DTD ou se eh alguma outra coisa. Parece que tem algum metodo para ativar a validacao, mas nao consegui.
O codigo do parser que teste foi

SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setFeature("http://xml.org/sax/features/validation", true);

SAXParser parser = factory.newSAXParser();
InputSource source = new InputSource("modules.xml");

parser.parse(source, new MeuXML2());

O XML e a DTD tem um formato como o seguinte:

DTD:

...
<!ELEMENT modulo 	(descricao, submodulo+)>
<!ELEMENT submodulo EMPTY>
...
<!ATTLIST modulo
	nome	CDATA	#REQUIRED
	id		ID		#REQUIRED
	visivel	(1|0)	"1"
>
	
<!-- submodulo -->
<!ATTLIST submodulo 
	nome 		CDATA 	#REQUIRED
	id 			ID		#REQUIRED
	visivel		(1|0)	"1"
	acaopadrao	NMTOKEN	#IMPLIED
>

XML:

<modulo nome="Contatos" id="contato" visivel="1">
<submodulo nome="Pessoa Física" id="contato_pessoa_fisica" visivel="1"/>
<submodulo nome="Pessoa Jurídica" id="contato_empresa" visivel="1" acaopadrao="editar"/>
</modulo>

Neste caso, mesmo se tiro o atributo “nome” ou “id” , o XML eh processado sem apresentar erro algum. O que esta errado?

Rafael

Não faço idéia do que vc tá falando… mas se isso é Java Básico, acho bom eu voltar pras aulas de lógica do cologial… :frowning:

hehe… eh que nao tem uma secao soh de xml, entao em j2ee nao da… dae fiquei em duvida, e coloquei no basico mesmo… O problema nao deve ser dificil, soh nao estou conseguindo achar o problema :mrgreen:

Rafael

Bom, consegui resolver o problema. Era necessario criar uma classe que implementa a interface org.xml.sax.ErrorHandler e definir os metodos. Entao passar esta classe de controle de erros para o processador xml.

Por exemplo

MeuErrorHandler implements ErrorHandler {
    // definicao dos metodos error, fatalError e Warning
}

na classe do parser ( que extende DefaultHandler ou algum outro ), o metodo error() da interface chama uma instancia de MeuErrorHandler para cuidar os erros.
Entao, na hora de fazer o processamento ( levando em base como eu ja estava fazendo antes, fica algo como:

SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
factory.setNamespaceAware(false);

SAXParser parser = factory.newSAXParser();
InputSource source = new InputSource("modules.xml");

parser.parse(source, new MeuXML2());

MeuXML2 nesse caso eh a classe que implementa DefaultHandler.

E tudo funciona agora :slight_smile:

Rafael

Bom, na verdade eh muito mais simples apenas implementar o metodo error(SAXParseException) e tratar o erro la dentro mesmo. Criar um outro ErrorHandler soh seria necessario se fosse necessario customizar os errors…

Rafael