JAXB Element mapping

后端 未结 1 587
谎友^
谎友^ 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<ThetaValueAdapter.Beta, String> {
    
        @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

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <alpha>
        <beta>
            <theta>abcd</theta>
        </beta>
    </alpha>
    

    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)
提交回复
热议问题