2011-07-18 183 views
2

我有屬性B B和C C A A類,我想編組和解組的方式,在C,而不是具有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?

回答

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(); 
    } 
} 
+0

我無法使「元素c」工作,因爲JAXB抱怨它不能在接口上工作,現在如果我將它保留爲對象,我可以稍後解析它,並且它可以工作。這是正確的做法嗎? – ilcavero

+0

@ilcavero:糟糕,我的錯誤,忘了添加@ @ XmlAnyElement。見編輯的答案。 – skaffman

1

你需要使用XmlAdapter實施C型

@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"; 
    } 
} 

希望這是你追求的。

問候 優素福

+0

謝謝您的回答,是不是真的是我要找的,因爲我將不得不當我想要的是由marshaller用來創建c對象然後被傳遞給XMLAdapter的XML時,使用「String marshal(C c)」上C的getters來手動構建XML。我正在尋找的是更接近於使用@XMLAnyElement的地方,您可以在其中獲得XML的DOM模型,我可以輕鬆地將其轉換爲String http://jaxb.java.net/tutorial/section_6_2_7_6-Collecting-Unspecified-元素-XmlAnyElement.html – ilcavero