代码之家  ›  专栏  ›  技术社区  ›  Cybratech xiaojieaa

JAXB在不创建子类的情况下取消标记子属性

  •  1
  • Cybratech xiaojieaa  · 技术社区  · 6 年前

    我要取消标记(简化的)XML结构,如下所示:

    <parent>
        <a>AValue</a>
        <b>BValue</b>
        <c someAttribute = "true">CValue</c>
    </parent>
    

    我知道如何声明这样的C类:

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "c", propOrder = {
            "someAttribute"
        })
    public class C{
        @XmlValue
        private String c;
        @XmlAttribute ( name="someAttribute")
        private boolean someAttribute;
        //getters and setters
    }
    

    把它作为班里的一个成员,像这样:

    public class Parent{
       private String a;
       private String b;
       private C c;
       //getters and setters for c,b,a
    }
    

    这对finde有效,我可以访问 C 通过 parent.getC().getC(); 我的问题 是如何做到的,我不需要创建一个类 C 得到 value attribute 属于 C 作为成员 parent ,而不编辑 起源 与新成员和其他getter和setter的pojo。 我已经尝试过通过听众来实现这一点,并搜索类似的结构,但我没有留下任何想法。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Cybratech xiaojieaa    6 年前

    我终于想出了如何做到这一点。 必须使用 @XmlJavaTypeAdapter 注释并将C类标记为 @XmlRootElement 以及一个 @XmlAccessorType(XmlAccessType.FIELD) . 此外,还需要使用 @XmlTransient 在用注释的字符串成员的getter上 @xmljavatypeadapter(XMLjavatypeadapter) .

    全面解决方案:

    C类:

    @XmlRootElement
    @XmlAccessorType(XmlAccessType.FIELD)
    public class C{
        @XmlValue
        private String c;
    
        @XmlAttribute
        private boolean someAttribute;
        //getters and setters for both
    

    类适配器:

    public class Adapter extends XmlAdapter<C, String> {
    
        public String unmarshal(C pC) throws Exception {
            //some possible handling with the attribute over pC.getSomeAttribute();
            return pC.getC();
        }
    
        public C marshal(String pC) throws Exception {
           C c = new C();
           c.setC(pC)
           //some possible handling to set the attribute to c
           return c;
        }
    

    班家长:

    public class Parent{
       private String a;
       private String b;
       @XmlJavaTypeAdapter(Adapter.class)
       private String c;
    
       @XmlTransient
        public String getC() {
            return c;
        }
       //getters and setters for b,a and setter for C
    }