Leitura de XML

6 respostas
ale.leleco

Amigos estou com um problema para ler um determinado XML, meu problema é o seguinte:
Tenho um XML com uma estrutura um pouco complexa, como exemplo este aqui vai mostrar bem o que eu preciso.

<Agenda> <Contato id="01"> <nome>nononononono</nome> <telefone> <residencial>121212121</residencial> <celular>[telefone removido]</celular> </telefone> <endereco>Alguma rua, 000</endereco> <email>[email removido]</email> </Contato> <Contato id="02"> <nome>anananananananan</nome> <telefone> </residencial> <celular>123456789</celular> </telefone> <endereco>Casa das primas, 123</endereco> <email>[email removido]</email> </Contato> </Agenda>

Consigo ler um XML simples usando o JDOM que é o que vou usar pois vou precisar guardar os valores das tags para validar as informações e depois jogar em um banco, bom meu problema é ler essas estrutura mais complexa, digo vários galhos em determinadas partes , como faço pra sair do nó principal e ir para o proximo nivel ???
o que faço hoje é mais ou menos assim:

public class LeitorXmlJdom {

	public void leitorXml(Config config) {
		Document doc = null;

		SAXBuilder builder = new SAXBuilder();

		try {

			doc = builder.build(config.getPathXml());

		} catch (Exception e) {

			e.printStackTrace();

		}

		Element agenda = doc.getRootElement();


		List<Element> lista = agenda.getChildren();


		for (Element e : lista) {

			System.out.println("Contato: " + e.getAttributeValue("id"));
			System.out.println("Nome: " + e.getChildText("nome"));
			System.out.println("Residencial: " + e.getChildText("residencial"));
			//não tenho idéia de como ir para este nó e depois voltar, imagino que tenha que usar algum for para subir o nó e ler mas não
			//tenho idéia de como fazer isso
			System.out.println("Telefones:");
			System.out.println("Residencial: " + e.getChildText("residencial"));
			System.out.println("Celular: " + e.getChildText("celular"));
			System.out.println("Endereço: " + e.getChildText("endereco"));
			System.out.println("E-mail: " + e.getChildText("email"));

		}

	}
}

Este é um exemplo do que to fazendo, bom para terem a dimensão do problema tenho que ler um arquivo XML da NF-e, validar ele, para depois jogar no banco, e a unica parte que estou tendo problemas é na leitura do arquivo, se alguem poder me ajudar, valew…

6 Respostas

Z

Olá ale.leleco,

Bom eu nunca fiz leitura de XML com Java, só com C# o que é bem fácil, porém será que não dá pra fazer algo assim:

for (Element e : lista) {  
  
            System.out.println("Contato: " + e.getAttributeValue("id"));  
            System.out.println("Nome: " + e.getChildText("nome"));  
            System.out.println("Residencial: " + e.getChildText("residencial"));  

           if(e.getName().equals("telefone")){  
            System.out.println("Telefones:"); 
            List<Element> listaDeTelefones = e.getChildren(); 
               for (Element tel : listaDeTelefones ) {
                 System.out.println("Residencial: " + tel.getChildText("residencial"));  
                System.out.println("Celular: " + tel.getChildText("celular")); 
               }
            }
 
            System.out.println("Endereço: " + e.getChildText("endereco"));  
            System.out.println("E-mail: " + e.getChildText("email"));  
 
        }

Não sei se isso fica meio POG, porém é uma idéia para você pensar. Qualquer coisa posta ai

abss

romarcio

Se possivel, use JDOM ou XStream, facilitam bastante a manipulação.
De uma olhada nesses 3 tutoriais, com certeza um deles será útil para você:
Manipulando Arquivo XML ? Parte I: API Nativa: http://wp.me/p1iE6J-4q
Manipulando Arquivo XML ? Parte II: JDOM: http://wp.me/p1iE6J-4G
Manipulando Arquivo XML ? Parte III: XStream: http://wp.me/p1iE6J-4Q

fantomas

Oi ale.leleco,

1) Existe um framework chamado XStream [url]http://xstream.codehaus.org/tutorial.html[/url], verifique a doc. talvez este componente venha a lhe ajudar.

2) Supondo que eu tenha entendido seu problema digo que vc tera que executar leituras (utilizando JDOM) recursivas no arquivo. Quando você ler uma tag e constatar que existem filhos (children) vc executa novamente a leitura passando como parametro cada filho encontrado. Na net com certeza deve haver um exemplo destas leituras.

flws

joaoorso

Dá uma olhada aqui :

Falou !

ale.leleco

Amigo Zabimaru deu certo + ou -
De qualquer modo isso mesmo que vou fazer..
o problema foi que ele gerava vários null nos telefones cada vez que percorria o for e já tinha escrito aquele telefone, com alguns IF eu consegui resolver o problema, não ficou o mais performatico nem mais bonito mas vai dar pra usar eu acho..
ficou assim:

for (Element e : lista) {

			System.out.println("Contato: " + e.getAttributeValue("id"));
			System.out.println("Nome: " + e.getChildText("nome"));
			List<Element> listaTelefone = e.getChildren();
			System.out.println("Telefones");
			for (int x = 0; x < listaTelefone.size(); x++) {
				// for (Element tel: listaTelefone) {
				if (listaTelefone.get(x).getChildText("celular") != null) {
					System.out.println("Celular: "
							+ listaTelefone.get(x).getChildText("celular"));

				}
				if (listaTelefone.get(x).getChildText("residencial") != null) {

					System.out.println("Residencial "
							+ listaTelefone.get(x).getChildText("residencial"));
				}

			}
			// System.out.println("Residencial: " + e.getChildText("telefone"));
			System.out.println("Endereço: " + e.getChildText("endereco"));
			System.out.println("E-mail: " + e.getChildText("email"));

		}

Bom galera quanto a maioria dos tutoriais que vi o que achei melhor foi trabalhar com o jdom mesmo já que meu XML sempre vai ter um formato expecifico, e vou precisar trabalhar com as informações depois, vou criar uma classe XML com todas as tags como parametros da classe e armazenar lá, acho que vai ser mais facil do que ficar pegando do arquivo que li. Não sei se vai ficar performático mas é isso que sei fazer então vai ter que ser assim, tudo bem que o código vai ficar imenso mas não tenho muita escolha.

fantomas

Fazer o que né?!?! Que assim seja.

flws

Criado 7 de março de 2012
Ultima resposta 7 de mar. de 2012
Respostas 6
Participantes 5