Jogo Rápido coluna Autor: Rodrigo Barbosa Cesar ([email protected]) Buscando informações em arquivos XML de forma simples com o JDOM H oje em dia, muita coisa se baseia em XML. Desde um simples histórico de uma aplicação de comunicação a complexos web sevices que compõem uma aplicação SOA. Dessa forma, é muito importante conhecer ferramentas para interpretar arquivos XML. Existem várias ferramentas que facilitam esta interpretação, como JAXB (Java Architecture for XML Binding), JAXP (Java API for XML Processing) e JDOM. Neste artigo, será visto como é simples buscar informações em um arquivo XML utilizando JDOM. Imagine que existe um arquivo com o nome de funcionarios.xml (Listagem 1), no qual está a lista de vendedores de uma distribuidora. Suponha que a aplicação deverá imprimir um relatório com todos os clientes de um determinado vendedor. Listagem 1. funcionarios.xml <?xml version=”1.0” encoding=”UTF-8”?> <funcionarios> <vendedor> <nome>George Carlos</nome> <idade>26</idade> <clientes> <comprador>Grandes Carros LTDA.</comprador> <comprador>Tubos Metalicos SA</comprador> </clientes> </vendedor> <vendedor> <nome>Rodrigo Cesar</nome> <idade>22</idade> <clientes> <comprador>Alite Telecom</comprador> <comprador>guiaminas.com</comprador> <comprador>Umaempresa LTDA.</comprador> </clientes> </vendedor> </funcionarios> 6 www.mundoj.com.br $PMVOBt+PHP3ÈQJEP Listagem 2. XmlReader.java import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.jdom.Attribute; import org.jdom.Document; O primeiro passo é acessar o site do JDOM e fazer o download da API. Para isso, acesse www.jdom.org e clique no link “Binaries” que está localizado logo abaixo de downloads. Na página “Binaries”, clique em JDOM 1.1 e faça o download. Na sequência, abra a IDE de sua preferência (eclipse, netbeans etc.) crie um novo projeto e carregue a API em seu classpath. A classe XmlReader apresentada na Listagem 2 mostra como pode ser feita a leitura do documento XML. Veja na tabela a seguir como é simples iniciar a leitura do documento: import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; public class XMLreader{ public List<String> search(String fileName, String findName) { SAXBuilder.build(File file); Retorna um Document, a partir dele você terá acesso ao primeiro elemento (raiz) do arquivo XML. document.getRootElement(); Retorna o primeiro elemento (um objeto Element) do arquivo XML. List<String> found = new ArrayList<String>(); File file = new File(fileName); SAXBuilder builder = new SAXBuilder(); Document document; try { document = builder.build(file); Element employee = document.getRootElement(); // abaixo da raiz (funcionarios) temos uma lista de vendedores List sellers = employee.getChildren(“vendedor”); Iterator it = sellers.iterator(); while (it.hasNext()) { Element seller = (Element) it.next(); // abaixo da lista de vendedores temos um nome, uma idade e os clientes Element name = seller.getChild(“nome”); if (element.getText().equals(text)) { found .add(name.getText()); Element costumers = seller.getChild(“clientes”); // abaixo de clientes temos uma lista de compradores List buyers = costumers.getChildren(“comprador”); Iterator i = buyers.iterator(); A partir de um objeto Element, é possível pegar um elemento filho ou uma lista de elementos filho, usando o getChild (para obter um filho) e getChildren (para obter a lista de filhos). Com getChild e getChildren, consegue-se facilmente navegar por todo documento. O objeto Element também possui o método getName, que retorna a “tag” atual (ou seja, nome do elemento). Outro método muito importante do objeto Element é o getText, que retorna o texto entre as tags do elemento. Para recuperar dados de atributos do elemento corrente, utilize o método getAttribute("nomedoatributo").getValue(). while (i.hasNext()) { Element buyer = (Element) i.next(); found.add(buyer.getText()); Listagem 3. Parte do documento funcionarios.xml. ... } <vendedor> } } } catch (JDOMException e) { <nome>George Carlos</nome> <idade>26</idade> e.printStackTrace(); } catch (IOException e) { ... e.printStackTrace(); } return found; } } Suponha que o método getChild() foi utilizado para navegar pelo documento até chegar no elemento na Listagem 3. Se for utilizado element. getName(), o retorno será “vendedor”. O método getChild("nome") faria com que descesse mais um nó, e então se poderá utilizar o getText() para SFUPSOBSi(FPSHF$BSMPTwt 7