Mostra notizie nelle discussioni
  • Avatar
    ☺
    Scritto da
    ::1
    il 2012-01-17 15:28:00.0 alle 2012-01-17 15:28:00.0
    Trollate totali: 12321
    [java-giambo] xml mapper cercasi
    Esigenza: 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.
    • Avatar
      ☺
      Scritto da
      il 2012-01-17 16:30:16.0 alle 2012-01-17 16:30:16.0
      Trollate totali: 42885
      Re: [java-giambo] xml mapper cercasi
      Scritto 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
      • Avatar
        ☺
        Scritto da
        ::1
        il 2012-01-18 11:24:51.0 alle 2012-01-18 11:24:51.0
        Trollate totali: 12321
        Re: [java-giambo] xml mapper cercasi
        Per la cronaca: ho risolto con una mappatura xpath -> jxpath
        Young professional woman and busy mom.
        • Avatar
          ☺
          Scritto da
          il 2012-01-18 11:38:25.0 alle 2012-01-18 11:38:25.0
          Trollate totali: 42885
          Re: [java-giambo] xml mapper cercasi
          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 Arrabbiato ?

          **Modificato dall'autore il 18.01.2012 11:39**
          `"la realta' non e' cosi' terrificante come vogliono farti credere" - Giambo ` - Wakko che cita Giambo
          • Avatar
            ☺
            Scritto da
            ::1
            il 2012-01-18 11:55:32.0 alle 2012-01-18 11:55:32.0
            Trollate totali: 12321
            Re: [java-giambo] xml mapper cercasi
            Scritto 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 Arrabbiato ?

            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.
<softv>

Pagina generata in 101 millisecondi

Utenti attivi: 12 nell'ultimo minuto, 31 negli ultimi cinque minuti, 66 negli ultimi 15 minuti