Como ler lista de valores de XMLs?

9 respostas
dambros

Boa tarde,

Estou precisando realizar uma atividade e estou um pouco perdido em como fazê-la, pois não acho exemplos específicos a respeito do assunto. Sendo assim, se alguém puder me apontar o caminho, ficaria grato.

Preciso ler um XML e persistir as informações do mesmo. Quanto a persistência não tenho dúvidas, mas estou com dificuldades para realizar a leitura do XML, pois o mesmo possui o seguinte formato:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><list>
<AL type="1111" value="Nome da Empresa"/>
<AL type="2222" value="10"/>
<AL type="Acti3333veUsers" value="20"/>
<AL addressType="MAC Address" type="44444" value="XX-XX-XX-XX-XX-XX"/>
<AL type="55555" value="YYYY"/>
</list>

Todos os exemplos que encontrei usando XStream, faziam referência a ler diretamente de estruturas simples, como por exemplo:

<equipe>
<nome>Mario</nome>
<endereco>Rua xxx</endereco>
</equipe>

Sendo assim, estou bem perdido em como conseguir armazenar essas informações em variáveis.

Agradeço desde já.

9 Respostas

luiz_renato

Olha,

Não mexo com o XStream (só com o JAXB) mas tem uns links q podem ajudar :
http://javasemcafe.blogspot.com.br/2011/06/xstream-criando-e-lendo-arquivos-xml.html
http://www.guj.com.br/java/251852-lista-com-o-xstream
http://mballem.wordpress.com/2011/05/12/manipulando-arquivo-xml-%E2%80%93-parte-iii-xstream/
http://xstream.codehaus.org/alias-tutorial.html.

Pelo que entendi vc tem qu usar alias pra referenciar uma lista …

dambros

luiz_renato:
Olha,

Não mexo com o XStream (só com o JAXB) mas tem uns links q podem ajudar :
http://javasemcafe.blogspot.com.br/2011/06/xstream-criando-e-lendo-arquivos-xml.html
http://www.guj.com.br/java/251852-lista-com-o-xstream
http://mballem.wordpress.com/2011/05/12/manipulando-arquivo-xml-%E2%80%93-parte-iii-xstream/
http://xstream.codehaus.org/alias-tutorial.html.

Pelo que entendi vc tem qu usar alias pra referenciar uma lista …

Primeiramente, obrigado pelo retorno.

Verifiquei os links e os mesmo fazem referência ao mesmo tipo de exemplo com estrutura mais simples que eu havia achado antes infelizmente.

Não tenho necessidade de usar o XStream, estava tentando utilizá-lo apenas por parecer ser o mais simples. No JAXB consigo fazer o que preciso? Em caso positivo teria como me dar algum exemplo utilizando ele e lendo algo próximo do meu xml de exemplo?

Obrigado.

J

Amigo, na minha visão a melhor forma de você ler estes dados, é ter sempre um POJO correspondente ao seu arquivo XML, por exemplo:

<Pessoa>
   <nome>joao</nome>
   <idade>10</idade>
</Pessoa>

Depois vc só cria seu e usa o Xstream…

XStream xStream = new XStream();        
Pessoa p = (Pessoa)xStream.fromXML(suaXMLcomoString);

depois disso vc acessa os valores direto de Pessoa…

Bom, não sei se isso atende as suas necessidades, mas é uma idéia…
Abraços

dambros

Josue Eduardo:
Amigo, na minha visão a melhor forma de você ler estes dados, é ter sempre um POJO correspondente ao seu arquivo XML, por exemplo:

<Pessoa>
   <nome>joao</nome>
   <idade>10</idade>
</Pessoa>

Depois vc só cria seu e usa o Xstream…

XStream xStream = new XStream();        
Pessoa p = (Pessoa)xStream.fromXML(suaXMLcomoString);

depois disso vc acessa os valores direto de Pessoa…

Bom, não sei se isso atende as suas necessidades, mas é uma idéia…
Abraços

Agradeço resposta, mas acredito que entre no mesmo dilema anterior: como crio um POJO do xml no meu exemplo?

Como pode ver ele usa uma lista interna no xml, e isso é exatamente o que está em confundindo…

Além da lista, como pego os valores dos atributos “type” e “value”, sendo que cada nó possui o mesmo nome “AL”?

J

Inicialmente não sou muito experiente com XML, talvez alguem ai possa aparecer e te dar uma resposta mais concreta sobre isso, mesmo assim vamos lá:
na questão do List... vc teria que basicamente ter um uma lista de "AL"... então vc teria algo como:
[code]
List lista = new ArrayList();
lista = (List) xStream.fromXML(arquivoXML);

Quanto ao type="11111" nunca utilizei o Xstream para fazer esse tipo de leitura, então prefiro não opinar por momento, mas qlqr coisa q eu achar eu coloco ae...

J

cara só pra complementar, da uma olhada e ve se te ajuda:


ele exlica como pegar os elementos das tags…

Abraços

luiz_renato

Olha,

Todos os link´s que foram passados (inclusive os meus) mostram como usar pojo´s pra XML inclusive com List´s mas se vc quizer do jeito muuuito mais difícil lá vai CTRL+C CTRL+V …

package pacote;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
/**  bean do node da lista */
@XmlRootElement(name="AL")
@XmlAccessorType(XmlAccessType.FIELD)
public class Al {
	
	@XmlAttribute
	private String value;
	
	@XmlAttribute
	private String type;
	
	@XmlAttribute
	private String addressType;
	
	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	

	public String getValue() {
		return value;
	}

	public void setValue(String value) {
		this.value = value;
	}

	public String getAddressType() {
		return addressType;
	}

	public void setAddressType(String addressType) {
		this.addressType = addressType;
	}
}

/** pojo com  lista propriamente dita*/
@XmlRootElement(name="list")
@XmlAccessorType(XmlAccessType.FIELD)
public class Lista {
	
	@XmlElement
	private List&lt;Al&gt; list;

	public List&lt;Al&gt; getList() {
		return list;
	}

	public void setList(List&lt;Al&gt; list) {
		this.list = list;
	}
}

public class Teste {
	
	public static void main(String[] args) throws JAXBException {
		Lista lista = new Lista();
		lista.setList(new ArrayList&lt;Al&gt;());
		
		Al a1 = new Al();
		a1.setType("111");
		a1.setValue("Nome da Empresa");
		
		Al a2 = new Al();
		a2.setType("2222");
		a2.setValue("10");
		
		Al a3 = new Al();
		a3.setType("44444");
		a3.setValue("XX-XX-XX-XX-XX-XX");
		a3.setAddressType("MAC Address");
		lista.getList().add(a1);
		lista.getList().add(a2);
		lista.getList().add(a3);
		
		JAXBContext context = JAXBContext.newInstance(Lista.class);
		Marshaller marshaller = context.createMarshaller();
		marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
		marshaller.setProperty(Marshaller.JAXB_ENCODING, "8859-1");
		
		JAXBElement&lt;Lista&gt; element = new JAXBElement&lt;Lista&gt;(new QName("list"),
				Lista.class, lista);
		
		StringWriter writer = new StringWriter();
		marshaller.marshal(element, writer);
		System.out.println(writer);
	}
}
dambros

Luiz, muito obrigado. Com esse “exemplo” (as aspas estão ai porque você praticamente me deu tudo pronto) fui capaz de fazer a parte do unmarshal sem grandes problemas e inclusive corrigir a parte de persistência. Funcionou como deveria :smiley:

Somente por desencargo de consciência, por que disse ser “muuuito mais difícil”? Foi devido ao uso de JAXB ao invés de XStream?

luiz_renato

Olha,

O JAXB é muito mais verboso e cheio de anotações , se vc quer mudar qualquer coisa, tem muito trabalho.Com o XStream é mais fácil.
Eu uso o JAXB porque entrei num projeto e terminei aprendendo na marra, nao aconselho pra quem está começando

Criado 17 de abril de 2013
Ultima resposta 19 de abr. de 2013
Respostas 9
Participantes 3