我有一个带有属性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实现这一目标?
答案 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";
}
}
希望这就是你所追求的目标。
此致 优素福