Manipulando arquivos XML em Java
Olá galera!!
Dessa vez trago para vocês um guia rápido com as principais funcionalidades da API Java 1.5 para manipular arquivos XML. Gostaria inicialmente de deixar claro que este tutorial não tem o propósito de ensinar conceitos de XML. Portanto, nos próximos parágrafos estarei assumindo que você já tem conhecimento sobre o referido tópico. Esse artigo é dividido em quatro seções. A primeira mostra um mapeamento entre elementos de um arquivo XML e classes em Java. A segunda ensina como transformar um arquivo XML em disco num objeto de manipulação em Java (parsing). Vamos fazer uma breve explanação sobre os principais métodos de acesso a dados já em memória na seção 3. E, finalmente, iremos mostrar como fazer consulta a documentos XML na seção 4.
Representação de elementos XML
A fim de facilitar o entendimento desta seção, vamos utilizar o documento XML abaixo e ilustrar a partir dele como é feita a representação de cada elemento após ele ser carregado em memória através do parsing (explicado na seção seguinte).
<html>
<head>
<title>Título</title>
</head>
<body onload="javascript:alert('Olá!')">
<p>Olá Mundo!</p>
</body>
</html>
Listagem 1 – Exemplo de um arquivo XML.
Todo o documento acima e informações de controle interno como codificação do texto são mapeados e acessados através da interface org.w3c.dom.Document. Ou seja, idealmente após fazer o parsing teremos um objeto que implementa essa interface, que é a visão mais “macro” de um arquivo XML em memória.
Numa visão mais detalhada do arquivo, temos a introdução de conceitos como Node, Element, Attr e Text, todos do pacote org.w3c.dom. Tanto o elemento Document quanto o Element, Attr e Text herdam da interface Node, ou seja, todos esses elementos são vistos como sendo nós da árvore XML.
Parsing
Uma das maneiras de se realizar o parsing de um arquivo XML é através do método parse(File f) da classe javax.xml.parsers.DocumentBuilder. Veja o trecho de código abaixo que mostra como se obter um Document através de um arquivo em disco:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(false);
DocumentBuilder docBuilder = dbf.newDocumentBuilder();
Document doc = docBuilder.parse(new File("arquivo.xml"));
Listagem 2 – Carregando um documento de um arquivo.
Para que o parsing suporte namespaces é necessário mudar o valor de false para true na linha em vermelho no código acima. Observe que o conceito e a utilização de namespaces foge ao escopo deste documento.
Agora que estamos com um Document em mãos, vamos mostrar como navegar através dos seus elementos, modificar seu conteúdo e gravá-lo em disco.
Métodos de manipulação de elementos
Além de todos os métodos definidos pela interface Node, a interface Document provê métodos para criação de atributos (Attr), elementos (Element) e textos (Text). Veja um resumo de como fazer isso:
- createAttribute(String name) – Cria e retorna um atributo que pode ser inserido em qualquer elemento do tipo Element através do método setAttributeNode(Attr newAttr).
- createElement(String tagName) – Cria e retorna um Element que pode ser inserido em outros Elements através do método appendChild(Node newChild) da interface Node.
- createTextNode(String data) – Cria e retorna elementos do tipo Text que podem ser inseridos através do mesmo appendChild citado acima em elementos do tipo Element.
A interface Document também possui um método getDocumentElement para obtenção do elemento raiz do XML. Tendo esse elemento do tipo Element em mãos, vamos mostrar um exemplo de código usando o XML da Listagem 1.
import java.io.IOException;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
...
Exibição do post interrompida. Para ler conteúdo completo,
clique aqui