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
>
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:
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.
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…