Parseando XML com DOM (maneira porca?)

23 respostas
V

Olá a todos,

É a primeira vez que eu estou tentando parsear um xml com DOM. Depois de procurar no google e no fórum, não consegui achar uma maneira que me pareça inteligente de parsear um XML

Aqui está parte do código:

private void trataLocalidade(Node node) {

        NodeList nodeList = node.getChildNodes();
        
        for (int i = 0; i < nodeList.getLength(); i++) {
            
            Node temp = nodeList.item(i);
            
            String nome = temp.getNodeName();
            String valor = temp.getFirstChild().getNodeValue();
            
            if (nome.equals("CIDADE")) {
                System.out.println(valor);
            } else if (nome.equals("ESTADO")) {
                System.out.println(valor);
            }
            
        }

    }

O código fica um lixo, cheio de IFs, uma bosta…

A pergunta é a seguinte: alguém sabe uma maneira melhor de fazer isso emporcalhando menos o código?

Eu tinha visto o XPath, parece ficar melhor, mas pelo o que eu entendi ele não é distribuido junto com o JRE1.4, aí ferrou… já que essa aplicação roda numa applet e tem que ser o mais lightweight possível…

Muito obrigado,

23 Respostas

_fs

Bem, você pode usar o XStream, cujo jar tem apenas 110kb. Mas se isso for demais pra você, vai ter que se acostumar com o DOM mesmo. Leia com cuidado a api dele, tem uns métodos interessantes.

V

Eu conheço o xstream, mas como o formato do XML não sou eu que controlo, não rola nesse caso…

Valew pela dica LIPE!

[]´s

renatosilva

Commons Digester para ler usando XPath, é bem simples

Se precisar escrever de volta, pode arriscar usar um tal de XML Vomiter, é um projeto de um fulano aí :smiley:

kuchma

Existe uma outra API chamada JDOM que eh interessante para fazer parse/geracao de XML tambem.

Marcio Kuchma

V

Obrigado todos! mas tanto o Commons Digester como o JDOM são bibliotecas muito grandes, o que impossibilita que eu as use…

Uma maneira que eu estou testando agora é fazer o downcastind de um Node para um Element, assim eu consigo usar o getElementsByTagName e elemino o for os Ifs…

Vou colocar o código aqui, caso alguém futuramente tenha o mesmo problema que eu tive…

Element teste = (Element) node;

System.out.println(teste.getElementsByTagName("CIDADE").item(0).getFirstChild());
System.out.println(teste.getElementsByTagName("ESTADO").item(0).getFirstChild());
renatosilva

O JAR do Digester tem 165KB é muita coisa?

V

O JAR do Digester tem 165KB é muita coisa?

Não tanto, mas ele tem dependências externas… aí que pega…

valew!

renatosilva

:shock: ih então ferrou, nem sabia disso, que feio

Eu tava pensando em criar uma parada que fosse o contrário do XML Vomiter, como o Digester, e que fosse independente e pequeno, com o controle que o XStream não dá, mas sem usar XPath. A ferramenta trabalharia diretamente sobre o texto do documento sem transformá-lo em nós DOM ou usar SAX, ou coisa parecida.

Porém parsear um XML é um pouco mais complicado do que gerá-lo.

V

Legal esse esquema, Renato…

Eu estava pensando até em fazer algo com regexp pra evitar de carregar todos os jars de parsers da sun e talz… Mas eu me lembrei que eu li, em algum lugar, que quando você usa expressões regulares para solucionar um problema, você ganha dois outros… Na época me pareceu bastante razoável a colocação do cara que escreveu isso…

renatosilva

Mas por que você precisa economizar espaço?

Mesmo com as dependências acho que o Digester não passa de 1MB.

V

renato3110:
Mas por que você precisa economizar espaço?

Mesmo com as dependências acho que o Digester não passa de 1MB.

Porque a aplicação roda numa applet, e com cento e poucos Kb já há reclamação de demora para carregar… imagei com um 1mb :smiley:

renatosilva

É você já falou isso mas eu não prestei atenção…

Bem, então vamos fazer uma ferramenta leve para isso!!!

class XMLLoader {

	public Evangelion getEva (XMLEater xe) {

		Evangelion eva = new Evangelion();

		xe.select("evangelion");

		eva.setName(xe.getAttribute("name"));
		eva.setPilot(xe.getChild("pilot"));

	}

}
Evangelion eva = loader.getEva(new XMLEater("eva.xml"));

Viajando na maionese :smiley: :smiley: :smiley:

kuchma

Razoavel por que? Pra mim parece FUD de quem nao sabe como aplicar as regexp.

Marcio Kuchma

V

Razoavel por que? Pra mim parece FUD de quem nao sabe como aplicar as regexp.

Marcio Kuchma

Marcio,

Dependendo do que vai ser feito com regexp o trabalho que vai dar pra manter não compensa. Mas é isso que você disse, tem que saber aonde aplicar, sair por aí usando em tudo, não é uma boa. E esse era o argumento do cara que disse isso.

http://groups-beta.google.com/group/alt.religion.emacs/msg/b59f4a602fb68f0a?rnum=1

V

Bora ae… só não posso agora pois estou enroscadão…

Pra Python tem um script bem interessante: BeautifulSoup

Seria legar tem um desse pra java, pra usar em aplicações que precisam ser lightweigh e que não carecem de DTDs e todas essas coisas…

TedLoprao

Não sei se ajuda, mas deem uma olhada:

http://www.javaworld.com/javaworld/jw-09-2004/jw-0906-xml.html

ps.: tinha comido um l na hora de colar, :lol:

V

TedLoprao:
Não sei se ajuda, mas deem uma olhada:

http://www.javaworld.com/javaworld/jw-09-2004/jw-0906-xml.htm

Ihh, o link tá quebrado…

TedLoprao

Pronto! Arrumado, faltou o l do html, hehehe

renatosilva

Vegetto, penso que achar uma tag e atributos dentro de um texto é fácil até, mas o problema é fazer a recursividade, sendo que tive uma idéia para resolver isso: quando for preciso analisar tags dentro de tags você delega a um método separado que receberá apenas aquele trecho, e assim sucessivamente até chegar nos elementos “atômicos” (sem filhos).

É a mesma idéia do vomiter, mas no sentido contrário.
Por isso não teria XPath.

Vegetto:
Bora ae… só não posso agora pois estou enroscadão…

Eu também estou enrolado, mas quando tivermos disponíveis, podemos nos contactar.

Luca

Olá

Para ficar bem levinho e rodar numa boa com applets é melhor usar simplesmente arquivos CSV (separados por vírgula). Quando isto não é possível porque quem escreveu o XML não é uma aplicação dentro da mesma empresa então a gente vai no google e pesquisa por parser xml lite. Aí se acha coisas assim:

XML DOM-lite parser and writer (artigo JavaWorld)

Open Source XML Parsers in Java. Neste link tem alguns parsers bem pequenos como o NanoXML Lite e o Piccolo.

[]s
Luca

renatosilva

Luca:
Olá

Para ficar bem levinho e rodar numa boa com applets é melhor usar simplesmente arquivos CSV (separados por vírgula). Quando isto não é possível porque quem escreveu o XML não é uma aplicação dentro da mesma empresa então a gente vai no google e pesquisa por parser xml lite. Aí se acha coisas assim:

XML DOM-lite parser and writer (artigo JavaWorld)

Open Source XML Parsers in Java. Neste link tem alguns parsers bem pequenos como o NanoXML Lite e o Piccolo.

[]s
Luca

Legal, hoje em dia para qualquer coisa que se queira fazer, já existe alguma coisa pronta. O problema é que eu tenho mania de criar minhas próprias coisas, é esquisito. Além de não ter saco de ficar lendo as documentações dessas ferramentas.

kuchma

Vegetto:
Dependendo do que vai ser feito com regexp o trabalho que vai dar pra manter não compensa. Mas é isso que você disse, tem que saber aonde aplicar, sair por aí usando em tudo, não é uma boa. E esse era o argumento do cara que disse isso.

http://groups-beta.google.com/group/alt.religion.emacs/msg/b59f4a602fb68f0a?rnum=1

Sei que isso esta off-topic neste post, mas nao custa defender as regexp (para que nao fique impressao errada em quem nao conhece o negocio):

The notion that everything is a stream of bytes is utterly braindead.
The notion that regexps are the solution to all problems is equally
braindead.

Just like Perl.

Some people, when confronted with a problem, think “I know, I’ll use
regular expressions.” Now they have two problems.

Tudo bem - o cara esta certo. E voce tambem esta certo. Tem que saber quando usar. Mas tem sua utilidade (e que utilidade), principalmente em busca e substituicao de textos. Nenhuma tecnologia serve para tudo. E eh isso - off-topic encerado.

Marcio Kuchma

V

Obrigado mais uma vez, Luca!

E Marcio, concordo totalmente com o que você disse também!

Obrigado a todos

Criado 1 de fevereiro de 2005
Ultima resposta 2 de fev. de 2005
Respostas 23
Participantes 6