如何部分编组/解组一个对象?

时间:2011-07-18 09:43:54

标签: java xml-serialization jaxb

我有一个带有属性B b和C c的A类,我想以一种方式编组和取消编组,而不是有一个java对象图,我想要一个XML片段的字符串表示,即

@XmlRootElement(namespace="test")
public class A {
   B b;
   C c;
   //omitting getters and setters
}

public class C {
   String xmlFragment;
   //This string will contain the following:
   //"<d>d</d><e><f>f1</f><f>f2</></e>
}

,生成/生成的XML看起来像

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<A xmlns="test">
 <B>some B content that is mapped to java objects</B>
 <C>
   <d>d</d><e><f>f1</f><f>f2</></e>
 </C>
</A>

我如何使用JAXB实现这一目标?

2 个答案:

答案 0 :(得分:3)

JAXB不会那样做。它能做的是处理org.w3c.dom.Element,并将其序列化为XML,即

@XmlRootElement(namespace="test")
public class A {
   B b;
   @XmlAnyElement Element c;
}

因此,您需要将该XML片段解析为Element(例如使用DocumentBuilderFactory),然后它才能正常工作。

我想,你可以在运行时解析Element,但要非常小心性能:

@XmlRootElement(namespace="test")
public class A {
   B b;
   String xmlFragment;

   @XmlAnyElement
   public Element getXmlFragment() {
       InputSource source = new InputSource(new StringReader(xmlFragment));
       Document doc = DocumentBuilderFactory.newInstance().parse(source);
       return doc.getDocumentElement();
   }
}

答案 1 :(得分:1)

您需要对C类使用XmlAdapter实现。

@XmlRootElement(namespace="test")
public class A {
   B b;
   @XmlJavaTypeAdapter(MyAdapter.class)
   C c;
    //omitting getters and setters
} 

class MyAdapter extends XmlAdapter<String,C> {
   public C unmarshal(String s) {
      // custom unmarshalling
      return null;
   }
   public String marshal(C c) {
      // custom marshalling
      return "blah";
   }
}

希望这就是你所追求的目标。

此致 优素福