Como ler e gravar arquivos XML com código

Como ler e gravar arquivos XML com código

Você gostaria de aprender a ler e escrever um arquivo XML de java?





Arquivos XML são usados ​​para uma variedade de finalidades, incluindo armazenamento de dados. Antes de JSON se tornar popular, XML era o formato preferido para representar, armazenar e transportar dados estruturados. Embora a popularidade do XML tenha diminuído nos últimos anos, você pode encontrá-lo ocasionalmente, por isso é importante aprender como trabalhar com ele a partir do código.





Java Standard Edition (SE) inclui o API Java para processamento XML (JAXP) , que é um termo abrangente que cobre a maioria dos aspectos do processamento XML. Esses incluem:





  • JULGAMENTO: O Document Object Model inclui classes para trabalhar com artefatos XML, como elemento, nó, atributos, etc. A API DOM carrega o documento XML completo na memória para processamento, portanto, não é muito adequado para trabalhar com arquivos XML grandes.
  • SAXOFONE: A API Simples para XML é um algoritmo orientado a eventos para leitura de XML. Aqui, o XML é processado disparando eventos encontrados ao ler XML. Os requisitos de memória para usar este método são baixos, mas trabalhar com a API é mais complexo do que trabalhar com o DOM.
  • StAX: A Streaming API for XML é uma adição recente às APIs XML e fornece filtragem de fluxo de alto desempenho, processamento e modificação de XML. Embora evite carregar todo o documento XML na memória, ele fornece uma arquitetura do tipo pull em vez de uma arquitetura orientada a eventos, portanto, o aplicativo é mais fácil de codificar e entender do que usar a API SAX.

Neste artigo, usamos o API DOM para demonstrar como ler e gravar arquivos XML de java. Cobriremos as outras duas APIs em artigos futuros.

Um arquivo XML de amostra

Para o propósito deste artigo, demonstramos os conceitos usando o seguinte exemplo de XML, que pode ser encontrado aqui :






Gambardella, Matthew
XML Developer's Guide
Computer
44.95
2000-10-01
An in-depth look at creating applications
with XML.


Ralls, Kim
...

Lendo um arquivo XML

Vejamos as etapas básicas necessárias para ler um arquivo XML usando a API DOM.

A primeira etapa é obter uma instância de DocumentBuilder . O construtor é usado para analisar documentos XML. Para uso básico, fazemos assim:





dicas sobre como iniciar um canal no youtube
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
DocumentBuilder builder = factory.newDocumentBuilder();

Agora podemos carregar todo o documento na memória, começando pelo elemento raiz XML. Em nosso exemplo, é o Catálogo elemento.

File file = ...; // XML file to read
Document document = builder.parse(file);
Element catalog = document.getDocumentElement();

E é isso, pessoal! A API DOM para ler um XML é realmente simples. Agora você tem acesso a todo o documento XML a partir de seu elemento raiz, Catálogo . Vamos agora ver como trabalhar com isso.





Usando a API DOM

Agora que temos a raiz XML Elemento , podemos usar a API DOM para extrair informações interessantes.

Pegue todos os livro filhos do elemento raiz e faça um loop sobre eles. Observe que getChildNodes () retorna tudo filhos, incluindo texto, comentários, etc. Para nosso propósito, precisamos apenas dos elementos filhos, portanto, pulamos os outros.

NodeList books = catalog.getChildNodes();
for (int i = 0, ii = 0, n = books.getLength() ; i Node child = books.item(i);
if ( child.getNodeType() != Node.ELEMENT_NODE )
continue;
Element book = (Element)child;
// work with the book Element here
}

Como você encontra um elemento filho específico, dado o pai? O método estático a seguir retorna o primeiro elemento correspondente, se encontrado, ou nulo. Como você pode ver, o procedimento envolve obter a lista de nós filhos e percorrê-los, escolhendo nós de elemento com o nome especificado.

static private Node findFirstNamedElement(Node parent,String tagName)
{
NodeList children = parent.getChildNodes();
for (int i = 0, in = children.getLength() ; i Node child = children.item(i);
if ( child.getNodeType() != Node.ELEMENT_NODE )
continue;
if ( child.getNodeName().equals(tagName) )
return child;
}
return null;
}

Observe que a API DOM trata o conteúdo de texto em um elemento como um nó separado do tipo TEXT_NODE . Além disso, o conteúdo do texto pode ser dividido em vários nós de texto adjacentes. Portanto, o seguinte processamento especial é necessário para buscar o conteúdo de texto dentro de um elemento.

static private String getCharacterData(Node parent)
{
StringBuilder text = new StringBuilder();
if ( parent == null )
return text.toString();
NodeList children = parent.getChildNodes();
for (int k = 0, kn = children.getLength() ; k Node child = children.item(k);
if ( child.getNodeType() != Node.TEXT_NODE )
break;
text.append(child.getNodeValue());
}
return text.toString();
}

Munidos dessas funções de conveniência, vamos agora examinar alguns códigos para listar algumas informações de nosso XML de amostra. Gostaríamos de mostrar informações detalhadas para cada livro, como as que estariam disponíveis em um catálogo de livros.

NodeList books = catalog.getChildNodes();
for (int i = 0, ii = 0, n = books.getLength() ; i Node child = books.item(i);
if ( child.getNodeType() != Node.ELEMENT_NODE )
continue;
Element book = (Element)child;
ii++;
String id = book.getAttribute('id');
String author = getCharacterData(findFirstNamedElement(child,'author'));
String title = getCharacterData(findFirstNamedElement(child,'title'));
String genre = getCharacterData(findFirstNamedElement(child,'genre'));
String price = getCharacterData(findFirstNamedElement(child,'price'));
String pubdate = getCharacterData(findFirstNamedElement(child,'pubdate'));
String descr = getCharacterData(findFirstNamedElement(child,'description'));
System.out.printf('%3d. book id = %s
' +
' author: %s
' +
' title: %s
' +
' genre: %s
' +
' price: %s
' +
' pubdate: %s
' +
' descr: %s
',
ii, id, author, title, genre, price, pubdate, descr);
}

Gravando saída XML

Java fornece o API XML Tranform para transformar dados XML. Usamos esta API com o transformação de identidade para gerar saída.

Como exemplo, vamos adicionar um novo livro elemento ao catálogo de amostra apresentado acima. Os detalhes do livro (como autor , título , etc) podem ser obtidos externamente, talvez de um arquivo de propriedades ou de um banco de dados. Usamos o seguinte arquivo de propriedades para carregar os dados.

id=bk113
author=Jane Austen
title=Pride and Prejudice
genre=Romance
price=6.99
publish_date=2010-04-01
description='It is a truth universally acknowledged, that a single man in possession of a good fortune must be in want of a wife.' So begins Pride and Prejudice, Jane Austen's witty comedy of manners-one of the most popular novels of all time-that features splendidly civilized sparring between the proud Mr. Darcy and the prejudiced Elizabeth Bennet as they play out their spirited courtship in a series of eighteenth-century drawing-room intrigues.

A primeira etapa é analisar o arquivo XML existente usando o método apresentado acima. O código também é mostrado abaixo.

File file = ...; // XML file to read
Document document = builder.parse(file);
Element catalog = document.getDocumentElement();

Carregamos os dados do arquivo de propriedades usando o Propriedades classe fornecida com java. O código é bastante simples e mostrado abaixo.

String propsFile = ...;
Properties props = new Properties();
try (FileReader in = new FileReader(propsFile)) {
props.load(in);
}

Depois que as propriedades são carregadas, recuperamos os valores que queremos adicionar do arquivo de propriedades.

String id = props.getProperty('id');
String author = props.getProperty('author');
String title = props.getProperty('title');
String genre = props.getProperty('genre');
String price = props.getProperty('price');
String publish_date = props.getProperty('publish_date');
String descr = props.getProperty('description');

Vamos agora criar um vazio livro elemento.

gerenciador de plug-in notepad ++ ausente
Element book = document.createElement('book');
book.setAttribute('id', id);

Adicionando os elementos filhos ao livro é trivial. Por conveniência, coletamos os nomes dos elementos necessários em um Lista e adicione os valores em um loop.

List elnames =Arrays.asList('author', 'title', 'genre', 'price',
'publish_date', 'description');
for (String elname : elnames) {
Element el = document.createElement(elname);
Text text = document.createTextNode(props.getProperty(elname));
el.appendChild(text);
book.appendChild(el);
}
catalog.appendChild(book);

E é assim que se faz. o Catálogo elemento agora tem o novo livro elemento adicionado. Tudo o que resta agora é escrever o XML atualizado.

Para escrever o XML, precisamos de uma instância de Transformador que é criado conforme mostrado abaixo. Observe que solicitamos recuo do XML de saída usando o setOutputProperty () método.

TransformerFactory tfact = TransformerFactory.newInstance();
Transformer tform = tfact.newTransformer();
tform.setOutputProperty(OutputKeys.INDENT, 'yes');
tform.setOutputProperty('{http://xml.apache.org/xslt}indent-amount', '3');

A etapa final na geração da saída XML é aplicar a transformação. O resultado aparece no fluxo de saída, System.out .

tform.transform(new DOMSource(document), new StreamResult(System.out));

Para gravar a saída diretamente em um arquivo, use o seguinte.

tform.transform(new DOMSource(document), new StreamResult(new File('output.xml')));

E isso conclui este artigo sobre leitura e gravação de arquivos XML usando a API DOM.

Você usou a API DOM em seus aplicativos? Como foi o desempenho? Por favor, deixe-nos saber nos comentários abaixo.

Compartilhado Compartilhado Tweet O email Canon vs. Nikon: Qual marca de câmera é melhor?

Canon e Nikon são os dois maiores nomes da indústria de câmeras. Mas qual marca oferece a melhor linha de câmeras e lentes?

Leia a seguir
Tópicos relacionados
  • Programação
  • Java
Sobre o autor Jay Sridhar(17 artigos publicados) Mais de Jay Sridhar

Assine a nossa newsletter

Junte-se ao nosso boletim informativo para dicas de tecnologia, análises, e-books grátis e ofertas exclusivas!

Clique aqui para se inscrever