[英]JaxB How to marshall the content of a list as individual tags
我正在使用JAXB作為編組器。
我有一個包含字符串列表和其他屬性的對象。 我想將列表內容編組為單獨的標簽。
我在代碼List<String> items
。 如果我將列表中的字符串“ apple”,“ banana”,“ orange”添加到列表中,則在整理結果xml為:
<items>
<apple/>
<banana/>
<orange/>
</items>
這可行嗎? 或者,要獲得該結果,我該如何更改對象?
(抱歉格式化,我不能做得更好)
我的建議是不要這樣。 而是讓您的XML消息如下所示(這將使每個人都更容易處理XML):
<items>
<item>apple</item>
<item>banana</item>
<item>orange</item>
</items>
好的,您決定不聽從我的建議:)。 這是您可以執行的操作:
創建一個XmlAdapter
,它可以將String
轉換為名稱等於String
的org.w3c.dom.Element
實例。
import javax.xml.bind.annotation.adapters.XmlAdapter; import javax.xml.parsers.*; import org.w3c.dom.*; public class StringAdapter extends XmlAdapter<Object, String> { private Document document; @Override public String unmarshal(Object v) throws Exception { Element element = (Element) v; return element.getTagName(); } @Override public Object marshal(String v) throws Exception { return getDocument().createElement(v); } private Document getDocument() throws Exception { if(null == document) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); document = db.newDocument(); } return document; } }
注釋你List<String>
現場/屬性@XmlJavaTypeAdapter
指向您的XmlAdapter
和@XmlAnyElement
注解。
import java.util.*; import javax.xml.bind.annotation.*; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; @XmlRootElement public class Items { private List<String> items = new ArrayList<String>(); @XmlAnyElement @XmlJavaTypeAdapter(StringAdapter.class) public List<String> getItems() { return items; } }
為了提高性能,請確保您的XmlAdapter
擁有Document
的實例,並在Marshaller
上設置XMLAdapter
使其具有狀態,以避免每次調用XmlAdapter
都需要重新創建它。
import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; public class Demo { public static void main(String[] args) throws Exception { JAXBContext jc = JAXBContext.newInstance(Items.class); Items items = new Items(); items.getItems().add("apple"); items.getItems().add("banana"); items.getItems().add("orange"); Marshaller marshaller = jc.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.setAdapter(new StringAdapter()); marshaller.marshal(items, System.out); } }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.