Acessando arquivos xml e dtd de dentro de um jar

Quando se desenvolve uma aplicação empacotada em um jar, e recursos que devem ser acessados pela aplicação encontram-se dentro do mesmo jar (como arquivos xml ou imagens, por exemplo), pegar uma referência para esses recursos pode ser um tanto complicado.

Devo admitir que quebrei a cabeça para conseguir a referência para um arquivo xml dentro de uma aplicação. Tratava-se na verdade de um caso de parse de um XML através de DOM, e este mesmo XML referenciava um DTD, que se encontrava junto do XML.

O problema é que o parse conseguia acessar o XML, mas se perdia ao tentar encontrar o DTD que o validava. A solução encontrada foi passar a URI do arquivo XML, pois dessa forma o parser consegue buscar o DTD no mesmo caminho.

Passar um InputStream não adianta muito, pois streams não dizem nada a respeito de onde estava o recurso.

Eis um trecho de exemplo, espero que ajude:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dbf.newDocumentBuilder();
URL xmlFileURL = LanguagesIdentifier.class.getResource("arquivo.xml");
Document doc = docBuilder.parse(xmlFileURL.toURI().toString());

Detalhe: tanto o XML quanto o DTD se encontravam no mesmo local que o arquivo .java que os acessava

[]’s

2 comentários sobre “Acessando arquivos xml e dtd de dentro de um jar

  1. Caro Gustavo,

    Estou assumindo que as classes sejam:

    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;

    Posicionei este código mas ele não achou LanguagesIdentifier e Document. Onde elas estão ?

    Obrigado!

  2. Obrigada, funcionou mesmo. No meu caso, estou utilizando outra biblioteca para parsear o xml, mas a lógica é a mesma:

    SAXBuilder sb = new SAXBuilder();
    Document d = sb.build(getClass().getResource(“experiment.xml”));

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s