Java JaxB如何将列表的内容打包为单个标记
我使用JAXB作为marshaller 我有一个包含字符串和其他属性列表的对象。我想将列表内容整理为单个标记 我在代码Java JaxB如何将列表的内容打包为单个标记,java,xml,jaxb,Java,Xml,Jaxb,我使用JAXB作为marshaller 我有一个包含字符串和其他属性列表的对象。我想将列表内容整理为单个标记 我在代码中列出了项目。如果将字符串“apple”、“banana”、“orange”添加到列表中,则在编组生成的xml时,我希望: <items> <apple/> <banana/> <orange/> </items> 这可行吗??或者,为了得到这个结果,我必须如何改变这个对象 (很抱歉格式化,我做得
中列出了项目
。如果将字符串“apple”、“banana”、“orange”添加到列表中,则在编组生成的xml时,我希望:
<items>
<apple/>
<banana/>
<orange/>
</items>
这可行吗??或者,为了得到这个结果,我必须如何改变这个对象
(很抱歉格式化,我做得太好了)我的建议
我的建议是不要这样做。而是让您的XML消息如下(这将使每个人都更容易处理您的XML):
XmlAdapter
和@xmlanyement
注释的@XmlJavaTypeAdapter
注释您的列表
字段/属性
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;
}
}
伟大的谢谢不幸的是,这样的XML对我来说是一种需求,而不是一种选择(这是其他人的选择!)…为了让其他读者了解完整性,为了完全获得预期结果,还需要将列表注释为@xmlementwrapper(name=“empty”)
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;
}
}
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;
}
}
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);
}
}