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

Anúncios

Expressão Regular para reconhecimento de comentários e strings

O código abaixo foi adaptado de um código publicado no artigo Regular Expressions and the Java Programming Language . No original são reconhecidos apenas comentários de uma linha.

A adaptação feita permite reconhecer comentários de multiplas linhas e Strings.


/*
* Prints out the comments found in a .java file.
*/
import java.util.regex.*;
import java.io.*;
import java.nio.*;
import java.nio.charset.*;
import java.nio.channels.*;

public class CharBufferExample {

    public static void main(String[] args) throws Exception {

        // Create a pattern to match comments
        Pattern pInline =
        Pattern.compile(”//.*$”, Pattern.MULTILINE);

        Pattern pMultiline =
        Pattern.compile(”\/{1}\*{1,}.*\*{1,}\/{1}”);

        Pattern pString =
        Pattern.compile(””{1}.*?”{1}”);

        // Get a Channel for the source file
        File f = new File(”nome_do_arquivo.java”);
        FileInputStream fis = new FileInputStream(f);
        FileChannel fc = fis.getChannel();

        // Get a CharBuffer from the source file
        ByteBuffer bb =
        fc.map(FileChannel.MapMode.READ_ONLY, 0, (int)fc.size());
        Charset cs = Charset.forName(”8859_1″);
        CharsetDecoder cd = cs.newDecoder();
        CharBuffer cb = cd.decode(bb);

        // Run some matches
        Matcher m = pInline.matcher(cb);
        while (m.find())
        System.out.println(”Found comment: “+m.group());

        // Run some matches
        Matcher multiline = pMultiline.matcher(cb);
        while (multiline.find())
        System.out.println(”Found comment: n”+multiline.group());

        // Run some matches
        Matcher strings = pString.matcher(cb);
        while (strings.find())
        System.out.println(”Found String: n”+strings.group());
    }
}

Referências sobre expressões regulares em Java:
http://java.sun.com/developer/technicalArticles/releases/1.4regex/
http://java.sun.com/j2se/1.5.0/docs/api/java/util/regex/Pattern.html
http://java.sun.com/j2se/1.5.0/docs/api/java/util/regex/Matcher.html
http://www.regular-expressions.info/java.html