Ler XML pela URL e gravar a informação para consultas futuras ![RESOLVIDO]

16 respostas
L

Bom galera, seguinte, estou precisando fazer a leitura de um xml pela URL e pegar os valores que serão retornados para futuras consultas.

Algo do tipo:
Passaria a url “http://10.5.11.61/geri/wsgeri.ashx?user=usuario&pass=senha&spass=12315454

E me retornaria um XML com uma estrutura parecida com essa :

<geri> <usuario> <nome>LEONARDO</nome> <login>999999</login> <trocasenha>False</trocasenha> <perfil>Nomeperfil</perfil> </usuario> <sistema> <modulo id="14" nome="relvolumetria" funcionalidade="visualizacao"/> <modulo id="19" nome="relvolumetriavdn" funcionalidade="visualizacao"/> <modulo id="41" nome="relwfmaderencia" funcionalidade="visualizacao"/> </sistema> </geri>

E ai gravaria as “colunas” filtrando por exemplo os modulos do sistema em um List ou ArrayList.

16 Respostas

awilaz

Boa tarde leopose,

Talvez fosse interessante você utilizar o DOM.

Veja o artigo: http://www.guj.com.br/articles/22

Abraço

A

cara,

vc pode usar esse link para vc pegar o valor da sua url e depois vc pode usar XStream para converter o xml obtido em objeto Java.

t+

L

Cara, obrigado pelas dicas, mas achei muito complicado para uma coisa simples. Lembro que o .net isso é feito em uma linha de código. Não é possivel que existe algo mais simples…

A

cara,

se vc me falar que isso aqui é complicado

try {
			URL url= new URL("http://10.5.11.61/geri/wsgeri.ashx?user=usuario&pass=senha&spass=12315454");
			URLConnection connection = url.openConnection();
			XStream xstream = new XStream();
			Object objeto = xstream.fromXML(connection.getInputStream());
			
		} catch (MalformedURLException e1) {
			e1.printStackTrace();
		} catch (IOException e1) {
			e1.printStackTrace();
		}

numa boa, desiste do java.

t+

L

Valeuuu, agora clareou bastante. Mas sem querer abusar muito mas já abusando (sei que a minha duvida vai fortalecer ainda mais a comunidade Java) como faço para navegar no objeto que recebeu a XML ?

No meu exemplo verificar os modulos do sistema passado na URL ?

A

cara,

vc vai criar uma entidade que espelhe o seu xml, ai é so vc fazer assim

Geri geri = (Geri) xstream.fromXML(connection.getInputStream());

que a entidade ja vai vim preenchida.
t+

L

alissonvla, mas se a xml não me retorna nehum objeto especifico ? Ele só funciona se vir formatado com alguma classe do meu projeto ?

Não consigo, por exemplo ir percorrendo as colunas do xml e verificar os dados dessas colunas ?

Tentei usando as dicas que me passou :

URL url = new URL("http://10.5.11.61/geri/wsgeri.ashx?user=9999&pass=leoleo&spass=9446a98a); URLConnection connection = url.openConnection(); XStream xstream = new XStream(); Object objeto = xstream.fromXML(connection.getInputStream()); System.out.println("O objeto é: "+objeto.toString());

Mas deu o erro:

javax.faces.el.EvaluationException: com.thoughtworks.xstream.mapper.CannotResolveClassException: geri at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102) at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) at javax.faces.component.UICommand.broadcast(UICommand.java:315) at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794) at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259) at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:409) at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1534) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215) at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98) at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162) at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:326) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:227) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:170) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:822) at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:719) at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1013) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) at com.sun.grizzly.ContextTask.run(ContextTask.java:71) at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) at java.lang.Thread.run(Thread.java:619) Caused by: com.thoughtworks.xstream.mapper.CannotResolveClassException: geri at com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:56) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.DynamicProxyMapper.realClass(DynamicProxyMapper.java:55) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.PackageAliasingMapper.realClass(PackageAliasingMapper.java:88) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.ClassAliasingMapper.realClass(ClassAliasingMapper.java:79) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.ArrayMapper.realClass(ArrayMapper.java:74) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.CachingMapper.realClass(CachingMapper.java:45) at com.thoughtworks.xstream.core.util.HierarchicalStreams.readClassType(HierarchicalStreams.java:29) at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:133) at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32) at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1035) at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1019) at com.thoughtworks.xstream.XStream.fromXML(XStream.java:904) at Bean.beanUsuario.arquivoxml(beanUsuario.java:52) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at javax.el.BeanELResolver.invokeMethod(BeanELResolver.java:737) at javax.el.BeanELResolver.invoke(BeanELResolver.java:467) at javax.el.CompositeELResolver.invoke(CompositeELResolver.java:254) at com.sun.el.parser.AstValue.invoke(AstValue.java:228) at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297) at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105) at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)

A

cara,

seu xml vai ser sempre esse formato?

<geri>  
<usuario>  
   <nome>LEONARDO</nome>  
   <login>999999</login>  
   <trocasenha>False</trocasenha>  
   <perfil>Nomeperfil</perfil>  
</usuario>  
<sistema>  
   <modulo id="14" nome="relvolumetria" funcionalidade="visualizacao"/>  
   <modulo id="19" nome="relvolumetriavdn" funcionalidade="visualizacao"/>  
   <modulo id="41" nome="relwfmaderencia" funcionalidade="visualizacao"/>  
</sistema>  
</geri>

se sim, entao o xstream vai te ajudar
se nao, entao vc vai ter q usar DOM para navegar no xml, como foi dito acima

t+

L

Meu xml vai ter sempre esta estrutura mas a quantidade de modulo irá variar conforme o usuário. Vou fazer uns testes com o DOM e depois posto o resultado.

A

cara,

é o xstream msm que vc tem usar, ele ja vai fazer o serviço para vc.

t+

L

Mas com o xStream tá dando o erro que eu postei e não sei porque está com esse erro…

A

cara,

vc chegou a ler os tutorias no site do XStream, da um lida la e ve qual é seu erro.

t+

L

Bom galera, consegui resolver meu problema com o DOM. Segui o tutorial do link http://www.guj.com.br/articles/22

Segue a solução:
public boolean alimentapermissao() {
        try {
    
URL url = new URL("http://10.5.11.61/geri/wsgeri.ashx?user=" + matricula + "&pass=" + senha + "&spass=2b7b152a16a12b0df6d0bb17f89ebb78");

            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            org.w3c.dom.Document doc = db.parse(url.openStream());

            Element dE = doc.getDocumentElement();

            if (getChildTagValue(dE, "nome") != null) {
                user.setNome(getChildTagValue(dE, "nome"));
                user.setMatricula(Integer.parseInt(getChildTagValue(dE, "login")));
                user.setTrocasenha(Boolean.parseBoolean(getChildTagValue(dE, "trocasenha")));
                user.setPerfil(getChildTagValue(dE, "perfil"));

                NodeList nd = dE.getElementsByTagName("modulo");
                for (int i = 0; i < nd.getLength(); i++) {
                    Element r = (Element) nd.item(i);

                    SistemaGeri umsistema = new SistemaGeri();
                    umsistema.setId(Integer.parseInt(r.getAttribute("id")));
                    umsistema.setDescricao(r.getAttribute("nome"));
                    umsistema.setVizualizacao(r.getAttribute("funcionalidade"));
                    sis.add(umsistema);
                }
                user.setSistema(sis);

//Método que percorre os nós
    private String getChildTagValue(Element elem, String tagName) throws Exception {
        NodeList children = elem.getElementsByTagName(tagName);
        if (children == null) {
            return null;
        }
        Element child = (Element) children.item(0);
        if (child == null) {
            return null;
        }
        return child.getFirstChild().getNodeValue();
    }
A

cara,

com o XStream seria bemmmm mais simples, mas se resolveu seu problema blz.

t+

L

Mas eu não tenho uma classe no formato que retorna a XML, então precisei ter esse trabalho todo com o DOM…

A

logico que vc nao vai ter a classe pronta, pq vc tem que cria-la neee…rsrsrs

t+

Criado 27 de outubro de 2011
Ultima resposta 3 de nov. de 2011
Respostas 16
Participantes 3