Qual é o Parse de XML mais rápido?

Olá pessoal!

Estou criando uma rotina que irá ler centenas de arquivos XML (são páginas JSF) para procurar por um determinado conteúdo. Não preciso navegar pelo documento inteiro, então acho que o SAX seria a opção mais indicada.

Fiz um teste usando o dom4j e fiz o parse de um arquivo de 128 linhas, conforme abaixo:

raizPag = new SAXReader(false).read(arquivoPagina);

aonde arquivoPagina é o tal arquivo de 128 linhas. Esse comando levou 1 minuto para terminar! Esse tempo para mim é inviável…

Gostaria de saber se a comunidade conhece alguma maneira de fazer essa busca de maneira mais rápida. Achei alguns tópicos sobre isso, mas são todos muito antigos…

Abs!!!

Já tentou com XPath?

Rodrigo, obrigado pela resposta!

Estou usando o xPath sim. Depois de fazer o parse, faço a seguinte busca:

rootElmt.selectSingleNode("ui:define[@name='titulo']/text()").getText();

O problema é que para fazer essa busca, preciso do rootElement, e para obter o rootElement preciso fazer o parse… E o que demora é o parse, a busca em si é bem rápida.

Agora, se tem como fazer a busca usando xPath sem fazer o parse, aí eu não sei. Você saberia dizer?

Talvez esse aqui te atenda numa boa:

http://stax.codehaus.org/
http://docs.oracle.com/javaee/5/tutorial/doc/bnbem.html

Provavelmente sua máquina tem um antivírus ligado :slight_smile:

Só para ver se é isso mesmo, execute o seu comando N vezes dentro do seu programa; você vai ver que só o primeiro arquivo é que leva esse 1 minuto :frowning:

Para ter uma idéia, para iniciar o Eclipse na máquina quando o antivírus está ligado, deixo iniciando e vou tomar um café.

Se estou com o antivirus desligado, ele inicia muito mais rapidamente :slight_smile:

Fiz um teste com o Stax e não deu muita diferença não…

                        System.out.println(new Date());
			InputStream in = new FileInputStream(arquivoXml);

			XMLInputFactory factory = XMLInputFactory.newInstance();
			XMLStreamReader parser = factory.createXMLStreamReader(in);

			System.out.println(new Date());
			
			for (int event = parser.next(); event != XMLStreamConstants.END_DOCUMENT; event = parser.next()) { // demora cerca de 1 minuto para passar dessa linha e entrar no for
			     System.out.println(new Date());                              
			     .....
                        }

Está demorando mais ou menos o mesmo tempo para passar da linha aonde é iniciada iteração.

Olha, acho que isso não tem muito a ver… rs.

Foi mal então

Pelo menos nos sites, dizem que ele é o parser mais rápido do oeste

[quote=jaboot]Foi mal então

Pelo menos nos sites, dizem que ele é o parser mais rápido do oeste[/quote]

Pois é também vi esses comentários. Porém tá demorando muito! rsrs.

Estou fazendo uns testes com apache commons io, usando FileUtils.readLines() e depois fazendo a busca meio que na mão. Vai muuuito mais rápido, e para o que eu preciso acho que vai funcionar de boa.

De qualquer forma muito obrigado pela ajuda!!!

Abs!