JAXB Element mapping

后端 未结 1 602
谎友^
谎友^ 2020-12-21 16:29

I have an xml similar to:

    
            
                    abcd
            
             


        
1条回答
  •  不思量自难忘°
    2020-12-21 16:59

    Note: I'm the EclipseLink JAXB (MOXy) lead and a member of the JAXB (JSR-222) expert group.


    Using Any JAXB (JSR-222) Implementation

    Using any JAXB (JSR-222) implementation you could use an XmlAdapter to map this use case.

    ThetaValueAdapter

    package forum9799081;
    
    import javax.xml.bind.annotation.adapters.XmlAdapter;
    
    public class ThetaValueAdapter extends XmlAdapter {
    
        @Override
        public Beta marshal(String string) throws Exception {
            Beta beta = new Beta();
            beta.theta = string;
            return beta;
        }
    
        @Override
        public String unmarshal(Beta beta) throws Exception {
            return beta.theta;
        }
    
        public static class Beta {
            public String theta;
        }
    
    }
    

    MyBean

    package forum9799081;
    
    import javax.xml.bind.annotation.*;
    import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
    
    @XmlRootElement(name = "alpha")
    public class MyBean {
        private String thetaValue;
    
        @XmlElement(name="beta")
        @XmlJavaTypeAdapter(ThetaValueAdapter.class)
        public String getThetaValue() {
            return this.thetaValue;
        }
    
        public void setThetaValue(String thetaValue) {
            this.thetaValue = thetaValue;
        }
    
    }
    

    Demo

    package forum9799081;
    
    import java.io.File;
    import javax.xml.bind.*;
    
    public class Demo {
    
        public static void main(String[] args) throws Exception {
            JAXBContext jc = JAXBContext.newInstance(MyBean.class);
    
            File xml = new File("src/forum9799081/input.xml");
            Unmarshaller unmarshaller = jc.createUnmarshaller();
            MyBean myBean = (MyBean) unmarshaller.unmarshal(xml);
    
            Marshaller marshaller = jc.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.marshal(myBean, System.out);
        }
    
    }
    

    input.xml/Output

    
    
        
            abcd
        
    
    

    Using EclipseLink JAXB (MOXy)

    Using MOXy you could use the @XmlPath extension to achieve the same mapping:

    package forum9799081;
    
    import javax.xml.bind.annotation.*;
    import org.eclipse.persistence.oxm.annotations.XmlPath;
    
    @XmlRootElement(name = "alpha")
    public class MyBean {
        private String thetaValue;
    
        @XmlPath("beta/theta/text()")
        public String getThetaValue() {
            return this.thetaValue;
        }
    
        public void setThetaValue(String thetaValue) {
            this.thetaValue = thetaValue;
        }
    
    }
    

    For More Information

    • http://blog.bdoughan.com/2010/07/xpath-based-mapping.html
    • http://blog.bdoughan.com/2011/09/mapping-objects-to-multiple-xml-schemas.html
    • http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html

    0 讨论(0)
提交回复
热议问题