-
[java-giambo] xml mapper cercasiEsigenza: classe già esistente:
public class StayClassyClass { private String gorgl, prot, rig; // getter - setter }
Xml in arrivo:<?xml version="1.0"?> <a-tag> <gorgl>burp</gorgl> <prot>formalanza/<prot> <enoniomica> <rig>gnec</rig> </enoniomica> </a-tag>
Che xml mapper posso usare che mi "spiani" l'xml e mi riempia l'oggetto?
Sto provando varie cose, ovvero jaxb, xml-beans, jixb, xstream.
Mi sembrano tutti estremamente complicati e overkill.
Considera che il mio caso è un xml un bel poù più complicato.
L'alternativa è fare una mappatura con xpath, ma mi pare una porcata, ci sono vari tool per i binding xml, possibile che non me ne va bene manco uno?
Che mi sto perdendo?Young professional woman and busy mom.-
Re: [java-giambo] xml mapper cercasiScritto daNon Autenticatoil 2012-01-17 16:00:43.0 alle 2012-01-17 16:00:43.0Scritto da: ::1
>> <?xml version="1.0"?> > <a-tag> > <gorgl>burp</gorgl> > <prot>formalanza/<prot> > <enoniomica> > <rig>gnec</rig> > </enoniomica> > </a-tag> >
errore di sintassi tag prot
-
Re: [java-giambo] xml mapper cercasiScritto da: ::1
> Che xml mapper posso usare che mi "spiani" l'xml e mi riempia l'oggetto?
AFAIK no, proprio perche' la "spianatura" comporta una perdita di informazioni: Se hai due attributi con il medesimo name ma "innestati" diversamente, quale dei due viene mappato nella top-gerarchia ?class Giambo { String uno, due, tre; // getter&setter }<Giambo> <uno>1</uno> <due>2/<due> <innestato> <tre>3</tre> </innestato> <troll> <tre>3</tre> </troll> </Giambo>
> L'alternativa è fare una mappatura con xpath, ma mi pare una porcata, ci sono vari tool per i binding xml, possibile che non me ne va bene manco uno?
> Che mi sto perdendo?
Trasforma l'XML (XSLT) in modo che sia mappabile 1:1 con la classe
**Modificato dall'autore il 17.01.2012 16:42**`"la realta' non e' cosi' terrificante come vogliono farti credere" - Giambo ` - Wakko che cita Giambo-
Re: [java-giambo] xml mapper cercasiPer la cronaca: ho risolto con una mappatura xpath -> jxpathYoung professional woman and busy mom.
-
Re: [java-giambo] xml mapper cercasiScritto da: ::1
> Per la cronaca: ho risolto con una mappatura xpath -> jxpath
E come fai a spianare una classe in maniera univoca ?
E perche' il mio messaggio sopra non ha i <br> (Rispettivamente \r\n) in ordine
?
**Modificato dall'autore il 18.01.2012 11:39**`"la realta' non e' cosi' terrificante come vogliono farti credere" - Giambo ` - Wakko che cita Giambo-
Re: [java-giambo] xml mapper cercasiScritto da: Giambo
> Scritto da: ::1
> > Per la cronaca: ho risolto con una mappatura xpath -> jxpath
>
> E come fai a spianare una classe in maniera univoca ?
>
> E perche' il mio messaggio sopra non ha i <br> (Rispettivamente \r\n) in ordine
?
Stamattina ho scritto questa classe:package it.suora.nciata.proott; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Properties; import javax.xml.xpath.XPathExpression; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; import org.apache.commons.jxpath.CompiledExpression; import org.apache.commons.jxpath.JXPathContext; import org.apache.xerces.parsers.DOMParser; import org.w3c.dom.Document; import org.xml.sax.InputSource; public class XPathObjectMapper { private Map<XPathExpression, CompiledExpression> mapping = new HashMap<XPathExpression, CompiledExpression>(); private void init(Properties mapping) { try { for (Enumeration<?> en = mapping.propertyNames(); en.hasMoreElements();) { String key = (String) en.nextElement(); String value = mapping.getProperty(key); String xpath = key; String jxpath = value; this.mapping.put( XPathFactory.newInstance().newXPath().compile(xpath), JXPathContext.compile(jxpath)); } } catch (Exception e) { throw new RuntimeException(e); } } public XPathObjectMapper(Properties mapping) { init(mapping); } public XPathObjectMapper(File file) { try { FileInputStream input = new FileInputStream(file); Properties mapping = new Properties(); mapping.load(input); input.close(); init(mapping); } catch (Exception e) { throw new RuntimeException(e); } } public XPathObjectMapper(String mappingResource) { try { InputStream input = this.getClass().getResource(mappingResource).openStream(); Properties mapping = new Properties(); mapping.load(input); input.close(); init(mapping); } catch (Exception e) { throw new RuntimeException(e); } } public void map(Document source, Object target) { JXPathContext targetContext = JXPathContext.newContext(target); for (Iterator<XPathExpression> iterator = mapping.keySet().iterator(); iterator.hasNext();) { XPathExpression xpath = iterator.next(); CompiledExpression jxpath = mapping.get(xpath); try { Object value = xpath.evaluate(source); jxpath.createPathAndSetValue(targetContext, value); } catch (XPathExpressionException e) { System.err.println(e.getMessage()); e.printStackTrace(); } } } public void map(InputSource source, Object target) throws Exception { DOMParser parser = new DOMParser(); parser.parse(source); map(parser.getDocument(), target); } public void map(String source, Object target) throws Exception { map(new InputSource(new ByteArrayInputStream(source.getBytes("UTF-8"))), target); } }
A cui dai in pasto una mappatura tipo:/percorso/xpath/tag = attributo/da/riempire /altro/percorso = altro/attributo
Purtroppo sono circa una settantina di attributi in tutto da un xml gigante e non gestisce le collection, però dovrei aver risolto e archiviato la questione.Young professional woman and busy mom.
-
Re: [java-giambo] xml mapper cercasiScritto da: Giambo
> E perche' il mio messaggio sopra non ha i <br> (Rispettivamente \r\n) in ordine
?
Boh. il curioso caso dei fine linea invertiti: nei cinemaYoung professional woman and busy mom.
-
-
-
-