Qual é a melhor biblioteca para o processamento XML em java [fechado]

Estou à procura na biblioteca java para analisar o XML (configuração complexa e ficheiros de dados), pesquisei um pouco no Google mas não consegui encontrar outro que não o dom4j (parece que estão a trabalhar no V2).. Eu dei uma olhada na configuração do commons, mas não gostei, outros projetos apache em XML parecem sob hibernação. Eu não avaliei dom4j por mim mesmo, mas só queria saber-do java tem outra (boa) biblioteca de processamento xml de código aberto? e como está a tua experiência com o dom4j?

Depois do @Voo's resposta deixe - me perguntar outra-devo usar java em classes construídas ou qualquer terceira biblioteca como dom4j.. Quais são as vantagens?

Author: Premraj, 2011-02-20

7 answers

De facto, o Java suporta 4 métodos para processar o XML da caixa:

Dom Parser/ Builder: toda a estrutura XML é carregada na memória e você pode usar os métodos DOM bem conhecidos para trabalhar com ela. DOM também permite que você escreva para o documento com transformações Xslt. Exemplo:

public static void parse() throws ParserConfigurationException, IOException, SAXException {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    factory.setValidating(true);
    factory.setIgnoringElementContentWhitespace(true);
    DocumentBuilder builder = factory.newDocumentBuilder();
    File file = new File("test.xml");
    Document doc = builder.parse(file);
    // Do something with the document here.
}

Analisador SAX: apenas para ler um documento XML. O analisador Sax executa através do documento e chama métodos de callback do Usuário. Existem métodos para o início/fim de um documento, elemento e assim no. São definidos em org.xml.SAX.ContentHandler e há um ajudante vazio, DefaultHandler.

public static void parse() throws ParserConfigurationException, SAXException {
    SAXParserFactory factory = SAXParserFactory.newInstance();
    factory.setValidating(true);
    SAXParser saxParser = factory.newSAXParser();
    File file = new File("test.xml");
    saxParser.parse(file, new ElementHandler());    // specify handler
}

Leitor/escritor StAx: isto funciona com uma interface orientada a dados. O programa pede o próximo elemento quando estiver pronto como um cursor / iterador. Você também pode criar documentos com ele. Deve ler-se o documento:

public static void parse() throws XMLStreamException, IOException {
    try (FileInputStream fis = new FileInputStream("test.xml")) {
        XMLInputFactory xmlInFact = XMLInputFactory.newInstance();
        XMLStreamReader reader = xmlInFact.createXMLStreamReader(fis);
        while(reader.hasNext()) {
            reader.next(); // do something here
        }
    }
}

Escrever o documento:

public static void parse() throws XMLStreamException, IOException {
    try (FileOutputStream fos = new FileOutputStream("test.xml")){
        XMLOutputFactory xmlOutFact = XMLOutputFactory.newInstance();
        XMLStreamWriter writer = xmlOutFact.createXMLStreamWriter(fos);
        writer.writeStartDocument();
        writer.writeStartElement("test");
        // write stuff
        writer.writeEndElement();
    }
}

JAXB: a mais recente implementação para ler documentos XML: faz parte do Java 6 em v2. Isto permite-nos serializar objectos java de um documento. Você lê o documento com uma classe que implementa uma interface para javax.xml.vincular.Unmarshaller (você tem uma classe para isso de JAXBContext.newInstance). O contexto tem que ser inicializado com as classes usadas, mas você só tem que especificar as classes raiz e não tem que se preocupar com classes referenciadas estáticas. Você usa anotações para indicar quais as classes que deverão ser elementos (@XmlRootElement) e quais os campos que são elementos (@XmlElement) ou atributos (@XmlAttribute, o que é Surpresa!)

public static void parse() throws JAXBException, IOException {
    try (FileInputStream adrFile = new FileInputStream("test")) {
        JAXBContext ctx = JAXBContext.newInstance(RootElementClass.class);
        Unmarshaller um = ctx.createUnmarshaller();
        RootElementClass rootElement = (RootElementClass) um.unmarshal(adrFile);
    }
}

Escrever o documento:

public static void parse(RootElementClass out) throws IOException, JAXBException {
    try (FileOutputStream adrFile = new FileOutputStream("test.xml")) {
        JAXBContext ctx = JAXBContext.newInstance(RootElementClass.class);
        Marshaller ma = ctx.createMarshaller();
        ma.marshal(out, adrFile);
    }
}

Exemplos copiados descaradamente de alguns slides antigos de palestras; -)

Editar: sobre " que API devo usar?". Bem, depende-nem todas as APIs têm as mesmas capacidades que você vê, mas se você tem controle sobre as classes que você usa para mapear o documento XML JAXB é a minha solução pessoal favorita, realmente elegante e simples (embora eu não o tenha usado para documentos realmente grandes, ele poderia ficar um pouco complexo). SAX é muito fácil de usar também e Afasta - te do DOM se não tiveres uma boa razão para o usares.uma API velha e desajeitada, na minha opinião. Eu não acho que existem bibliotecas modernas de terceiros que possuem algo especialmente útil que está faltando no STL e as bibliotecas padrão têm as vantagens usuais de ser extremamente bem testadas, documentadas e estáveis.

 179
Author: Voo, 2018-01-25 18:12:16

O Java suporta dois métodos para o processamento XML a partir da caixa.

SAXParser

Pode usar este analisador se quiser processar ficheiros XML grandes e / ou não quiser usar muita memória.

Http://download.oracle.com/javase/6/docs/api/javax/xml/parsers/SAXParserFactory.html

Exemplo: http://www.mkyong.com/java/how-to-read-xml-file-in-java-sax-parser/

DOMParser

Pode usar este analisador se necessidade de fazer consultas XPath ou necessidade de ter o DOM completo disponível.

Http://download.oracle.com/javase/6/docs/api/javax/xml/parsers/DocumentBuilderFactory.html

Exemplo: http://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/

 8
Author: RAJH, 2013-09-22 09:59:24
O ponto da Nikita é excelente: não confundas maduro com mau. O XML não mudou muito. O JDOM seria outra alternativa ao DOM4J.
 4
Author: duffymo, 2011-02-20 19:03:57

Você não precisa de uma biblioteca externa para processar XML em Java. Java vem com implementações embutidas para SAX e DOM há séculos.

 3
Author: ChrisJ, 2011-02-20 19:05:34

Se você quiser uma API Tipo DOM-isto é, uma onde o analisador XML transforma o documento em uma árvore de elementos e nós de atributos - então há pelo menos quatro para escolher: DOM em si, JDOM, DOM4J, e XOM. A única razão possível para usar DOM é porque é percebido como um padrão e é fornecido no JDK: em todos os outros aspectos, os outros são todos superiores. Minha própria preferência, por sua combinação de simplicidade, poder e desempenho, é XOM.

E, claro, há outros estilos de processamento: interfaces de processamento de baixo nível (SAX e StAX), interfaces de ligação de dados-objeto (JAXB), e linguagens declarativas de alto nível (XSLT, XQuery, XPath). O que é melhor para você depende de seus requisitos de projeto e seu gosto pessoal.
 3
Author: Michael Kay, 2011-02-20 23:40:53

Para as pessoas interessadas em usar o JDOM, mas com medo que não tenha sido atualizado há algum tempo (especialmente não alavancando os genéricos Java), há um garfo chamado CoffeeDOM que exatamente aborda esses aspectos e moderniza a API JDOM, leia mais aqui:

Http://cdmckay.org/blog/2011/05/20/introducing-coffeedom-a-jdom-fork-for-java-5/

E descarrega-o da página do projecto em:

Https://github.com/cdmckay/coffeedom

 3
Author: ngeek, 2016-08-20 14:27:27

O VTD-XML é o XML pesado para processar a lib... é melhor do que os outros em praticamente todos os sentidos... aqui está um artigo de 2013 que analisa todos os frameworks de processamento XML disponíveis na plataforma java...

Http://sdiwc.us/digitlib/journal_paper.php?paper=00000582.pdf

 0
Author: vtd-xml-author, 2016-04-18 06:43:07