Melhor analisador de XML para Java [fechado]

387

Eu preciso ler arquivos XML pequenos (no máximo, alguns MB, codificados em UTF-8), vasculhar vários elementos e atributos, talvez modificar alguns e gravar o XML novamente em disco (de preferência com formatação agradável e recuada) .

Qual seria o melhor analisador de XML para minhas necessidades? Há muito por onde escolher. Alguns dos quais estou ciente são:

E, claro, o do JDK (estou usando Java 6). Estou familiarizado com o Xerces, mas acho desajeitado.

Recomendações?

Evan
fonte
6
Eu acho que você pode encontrar mais jogadores aqui: xml.com/lpt/a/1703
dma_k
11
Eu acho que existem problemas reais com esta pergunta. É que está comparando coisas totalmente diferentes, agrupando analisadores (xerces, carmesim) e bibliotecas de manipulação de dom (dom4j, xom, jdom). também as respostas tendem a advogar e não são tão construtivas.
Nathan Hughes
51
+220 e não construtivo. Claramente, moderadores e usuários têm perspectivas diferentes sobre o que é construtivo.
Tboberg
5
Sim, parece que os mods são míopes quando se trata de perguntas como esta. Sim, as respostas seriam opinativas, mas definitivamente baseadas na experiência e, na maioria das vezes, as respostas são quantificadas. Os mods precisam criar provavelmente uma tag diferente para mover essas questões que estão abertas para discussão, o que resulta em críticas e resultados construtivos.
Ashraff Ali Wahab 11/02
@dma_k seu link não está funcionando.
gaurav

Respostas:

81

Se velocidade e memória não forem problema, dom4j é uma opção muito boa. Se você precisar de velocidade, o uso de um analisador StAX como o Woodstox é o caminho certo, mas você precisa escrever mais código para fazer as coisas e se acostumar a processar XML em fluxos.

Zehrer
fonte
6
dom4j é muito bom, mas definitivamente não sem problemas. Para boas alternativas DOM4J, consulte stackoverflow.com/questions/831865/...
Jonik
@zehrer eles são seguros para threads?
gaurav
257

Eu acho que você não deve considerar nenhuma implementação específica do analisador. A API Java para processamento XML permite usar qualquer implementação de analisador em conformidade de maneira padrão. O código deve ser muito mais portátil e, quando você perceber que um analisador específico ficou muito antigo, poderá substituí-lo por outro sem alterar uma linha do seu código (se você fizer isso corretamente).

Basicamente, existem três maneiras de lidar com XML de maneira padrão:

  • SAX Esta é a API mais simples. Você lê o XML definindo uma classe Handler que recebe os dados dentro dos elementos / atributos quando o XML é processado de maneira serial. É mais rápido e mais simples se você planeja apenas ler alguns atributos / elementos e / ou escrever alguns valores de volta (seu caso).
  • DOM Esse método cria uma árvore de objetos que permite modificá-lo / acessá-lo aleatoriamente, para melhor manipulação e manipulação complexas de XML.
  • StAX Está no meio do caminho entre SAX e DOM. Você acabou de escrever um código para extrair os dados do analisador de seu interesse quando são processados.

Esqueça as APIs proprietárias, como JDOM ou Apache (por exemplo, Apache Xerces XMLSerializer ), porque o vinculará a uma implementação específica que pode evoluir no tempo ou perder a compatibilidade com versões anteriores, o que fará com que você altere seu código no futuro quando desejar atualizar para uma nova versão do JDOM ou qualquer analisador usado. Se você aderir à API padrão Java (usando fábricas e interfaces), seu código será muito mais modular e sustentável.

Não há necessidade de dizer que todos (não verifiquei todos, mas tenho quase certeza) dos analisadores propostos estão em conformidade com uma implementação JAXP, para que tecnicamente você possa usar tudo, não importa qual.

Fernando Miguélez
fonte
11
Na verdade, três maneiras: StAX (javax.xml.stream) é o terceiro padrão.
StaxMan 23/04/09
11
java-samples.com/showtutorial.php?tutorialid=152 (pessoalmente, adoro SAX)
kitokid
O @kitokid Chrome me diz que a página tem coisas desagradáveis. Eu usei isso em vez disso: sce.uhcl.edu/yue/courses/xml/notes/xmlparser/IntroDOM.asp
Ryan Shillington
Boa visão geral: apenas uma coisa com a qual eu discordo - enquanto que para incremental / streaming, SAX e Stax são bons, API padrão suficiente, para DOM, esse não é o caso (IMO): existem razões válidas para tomadas específicas de Java, como XOM, JDOM e DOM4J: o DOM independente de idioma é bastante complicado de usar.
StaxMan 27/01
130

Aqui está uma boa comparação sobre DOM, SAX, StAX e TrAX (Fonte: http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.6/tutorial/doc/SJSXP2.html )

Recurso StAX SAX DOM TrAX

Tipo de API                 Pull, streaming Push, streaming Na árvore de memória Regra XSLT

Facilidade de uso           Alto Médio Alto Médio

Capacidade XPath    Não Não Sim Sim

CPU e memória     Bom Bom Varia Varia

Encaminhar apenas        Sim Sim Não Não

Leia XML              Sim Sim Sim Sim

Escreva XML              Sim Não Sim Sim

CRUD                      Não Não Sim Não

Kadir
fonte
7
Você pode escrever XML com SAX. O coletor fornece uma implementação de manipulador na qual o usuário pode chamar eventos SAX para gerar saída XML. (Eu vejo que a tabela é originária e não material original, a tabela é que errado)
Dev
4

Além do SAX e do DOM, há a análise STaX disponível usando XMLStreamReader, que é um analisador pull de XML.


fonte
3

Eu descobri que dom4j é a ferramenta para trabalhar com XML. Especialmente comparado ao Xerces.

Brian Matthews
fonte
2

Eu não recomendaria isso: você tem muito "pensamento" em seu aplicativo, mas o uso do XSLT poderia ser melhor (e potencialmente mais rápido com a compilação de XSLT para bytecode) do que a manipulação Java.


fonte
3
Melhor, possível: mais rápido, muito improvável.
StaxMan
Ler, manipular e escrever XML é exatamente o que o XSLT foi projetado para fazer. Esta é uma boa resposta pronta para uso.
james.garriss
1

Se você se preocupa menos com o desempenho, sou um grande fã do Apache Digester, pois ele essencialmente permite mapear diretamente do XML para o Java Beans.

Caso contrário, você deve primeiro analisar e depois construir seus objetos.

Uri
fonte
Não preciso criar Java Beans, apenas manipular um pouco os elementos XML brutos e revisar certos elementos para obter dados deles, para que um analisador de estilo DOM seja provavelmente a minha solução ideal.
Evan
Sim, dom4j seria provavelmente uma solução melhor lá ... Eu costumava usá-lo fortemente, até que eu fui um nível acima para digestor
Uri