[RESOLVIDO] Lendo XML com o máximo de desempenho

7 respostas
T

Pessoal,
estou utilizando o JDOM para realizar a leitura de um xml em memória, a leitura está sendo feita perfeitamente, mas um pouco lenta.
O xml contém, aproximadamente, 15.000 itens, cada 1 com 20 tags, a leitura do xml + preenchimento da lista de objetos está durando uns 15 segs.
Preciso realizar este tratamento o mais rápido possível, mas não encontrei outra solução.

Segue abaixo um exemplo de como estou realizando a leitura:
private void lerXML( String xml )
    { 
    	try {
    		SAXBuilder sb = new SAXBuilder();

			Document d = sb.build( new StringReader( xml ) );

			Element mural = d.getRootElement();

			List elements = mural.getChildren();
			Iterator i = elements.iterator();

			while ( i.hasNext() ) {
				Element element = (Element)i.next();
				System.out.println( "Código:" + element.getAttributeValue( "id" ) );
				System.out.println( "Prioridade:" + element.getAttributeValue( "prioridade" ) );
				System.out.println( "Para:" + element.getChildText( "para" ) );
				System.out.println( "De:" + element.getChildText( "de" ) );
				System.out.println( "Corpo:" + element.getChildText( "corpo" ) );
			} 
        } catch ( Exception e ) {
	        // TODO: handle exception
        }
    }

Alguém tem alguma idéia de como realizar esta leitura de forma mais rápida?

Grato desde já.

7 Respostas

E

Em vez de usar JDOM, pode usar SAX ou StAX. (Não é porque você usa “SAXBuilder” que está usando SAX :frowning: )
No seu caso, se você procurar por StAX, provavelmente não terá muita dificuldade de transformar seu código.

T

entanglement:
Em vez de usar JDOM, pode usar SAX ou StAX. (Não é porque você usa “SAXBuilder” que está usando SAX :frowning: )
No seu caso, se você procurar por StAX, provavelmente não terá muita dificuldade de transformar seu código.

Você acha que terei um bom ganho de desempenho utilizando o StAX?

Obrigado pela ajuda.

Luca

Olá

tchinfurinfu:
entanglement:
Em vez de usar JDOM, pode usar SAX ou StAX. (Não é porque você usa “SAXBuilder” que está usando SAX :frowning: )
No seu caso, se você procurar por StAX, provavelmente não terá muita dificuldade de transformar seu código.

Você acha que terei um bom ganho de desempenho utilizando o StAX?

Obrigado pela ajuda.

Sim, a dica do entanglement foi muito boa. Tente o StAX que já vem com o Java 6.

[]s
Luca

T

Show !!!
Vou tentar e depois posto aqui dizendo quanto foi o ganho !
Valeu galera.

renzonuccitelli

Não querendo puxar a sardinha, mas já puxando, que tal usar o JColtrane? O manual é escrito em português e pelo que vi de seu código de leitura, que está mais interessado em filtrar elementos, ele cairia como uma luva. Fora que esse seu xml grande, se vc for ler vários de uma vez, vai acabar estourando a memória se usar JDOM, uma vez que ele carrega toda a “árvore” na memória.

[]s

E

O JColtrane é um encapsulamento do SAX que o torna quase tão fácil de usar quanto o DOM. Então é realmente recomendado.

T

renzonuccitelli:
Não querendo puxar a sardinha, mas já puxando, que tal usar o JColtrane? O manual é escrito em português e pelo que vi de seu código de leitura, que está mais interessado em filtrar elementos, ele cairia como uma luva. Fora que esse seu xml grande, se vc for ler vários de uma vez, vai acabar estourando a memória se usar JDOM, uma vez que ele carrega toda a “árvore” na memória.

[]s

Parabéns renzonuccitelli.
Gostei bastante da API.
Ainda estou implementando e, como sou novato em Java Annotation, estou com uma dúvida. Seguinte:
Eu consigo realizar um filtro com 2 valores possíveis?
Por exemplo:
No código abaixo eu estou obtendo o valor do body quando tag = “or”.

@EndElement(tag = "or") public void readSourceTag( @Body String body ) { System.out.println( "Origem - " + body ); }
Mas eu também tenho que fazer o mesmo tratamento para quando tag = “o”.
Há uma maneira de fazer sem ter que implementar outro método?
Algo como:@EndElement(tag = "or", tag = "o")

Obrigado pela ajuda.

Criado 24 de junho de 2010
Ultima resposta 25 de jun. de 2010
Respostas 7
Participantes 4