[英]JAXB - how to marshal a whole XML section to a string
我有一個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>
如何做呢?
您可以為此類任務編寫xmljavatype適配器。
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Foo {
@XmlJavaTypeAdapter(BazXmlAdapter.class)
@XmlAnyElement
String baz;
String bar;
}
any用來告訴jaxb此處允許任何內容(避免非法注釋異常,因為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)));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.