2015-04-30 38 views
1

我有一個XML文件:JAXB - 如何封送整個XML部分爲一個字符串

<foo> 
    <bar>...</bar> 
    <baz attr="something> 
    <child1>...</child1> 
    </baz> 
</foo> 

我想JAXB它元帥下列對象:

@XmlRootElement 
public class Foo { 
    Bar bar; 
    String baz; 
} 

會在哪裏baz將XML中的實際baz部分作爲字符串。即:

 
<baz attr="something"> <child1>...</child1> </baz> 

該怎麼辦?

+0

可能重複http://stackoverflow.com/questions/5957708/how-do-i-specify- - 適配器 - which-jaxb-uses-marshaling-unmarshaling-data) –

回答

2

您可以爲此類任務編寫一個xmljavatype適配器。

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Foo { 

    @XmlJavaTypeAdapter(BazXmlAdapter.class) 
    @XmlAnyElement 
    String baz; 

    String bar; 
} 

任何用來告訴JAXB任何內容,這裏允許(避免了illegalannotation異常,因爲JAXB不能處理接口)

public class BazXmlAdapter extends XmlAdapter<Element, String> { 

    @Override 
    public Element marshal(String v) throws Exception { 
     // TODO NYI Auto-generated method stub 
     throw new UnsupportedOperationException(); 
    } 

    @Override 
    public String unmarshal(Element node) throws Exception { 
     TransformerFactory transFactory = TransformerFactory.newInstance(); 
     Transformer transformer = transFactory.newTransformer(); 
     StringWriter buffer = new StringWriter(); 
     transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
     transformer.transform(new DOMSource(node), new StreamResult(buffer)); 
     return buffer.toString(); 
    } 
} 

適配器執行只是一個簡單的DOM系列化,沒有什麼花哨。您可以改用內容的JAXB模型並對其進行序列化。比你不需要@XmlAnyElement要麼。

@Test 
public void unmarshalPartialXml() throws Exception { 
    String partial = "<baz attr=\"something\"/>"; 
    String xml = "<foo><bar>asdf</bar>" + partial + "</foo>"; 

    Unmarshaller unmarshaller = JAXBContext.newInstance(Foo.class) 
     .createUnmarshaller(); 

    Foo foo = (Foo) unmarshaller.unmarshal(new StringReader(xml)); 

    assertThat(foo.baz, is(equalTo(partial))); 
} 
的[我如何指定JAXB用來編組/解組數據時,適配器(S)?(
+0

謝謝。但是我怎樣才能編寫一個可以映射到你顯示的Java類('Foo')的xsd? –

+0

請參閱:http://stackoverflow.com/q/29988023/1038182 –

相關問題