我有JAXB注释:
@XmlElement(name="String")
private String string = "one";
@XmlElement(name="ArrayOne")
private ArrayList<String> array1 = new ArrayList<String>();
和编组:
array.add("Just one");
JAXBContext jc1 = JAXBContext.newInstance( getClass() );
Marshaller marshaller = jc1.createMarshaller();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance() ;
Document doc = factory.newDocumentBuilder().newDocument();
marshaller.marshal(this, doc);
如果我深入研究文档节点,我看不出两者之间有任何区别节点元素。我的问题是,如果有什么技巧可以整理到DOM文档中,无论是简单对象(String(,或数组对象。Marshaller当然知道字段类型,所以我想知道,如果它在元素数据中放入一些标志。
DOM结构为
NodeName:String NodeContent:one
NodeName:ArrayOne NodeContent:Just one
但我想有这样的:
NodeName:String NodeContent:one
NodeName:ArrayOne
Children:
NodeName:ArrayOne NodeContent:Just one
所以我知道,ArrayOne就是数组,不管只是一个对象。
请注意,我不能更改注释,因为并不总是有可用的源。
您可以使用@XmlElementWrapper:为集合创建包装器元素
@XmlElement(name="String")
private String string = "one";
@XmlElementWrapper(name="ArrayOne")
private ArrayList<String> array1 = new ArrayList<String>();
此映射的XML输出如下所示:
<testElement>
<String>one</String>
<ArrayOne>
<array1>one</array1>
</ArrayOne>
</testElement>
更新评论:手动在DOM文档上添加包装器(可能有一种更简单的方法,可能是使用Transformer(:
TestElement te = new TestElement();
JAXBContext jc1 = JAXBContext.newInstance(TestElement.class);
Marshaller marshaller = jc1.createMarshaller();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance() ;
Document doc = factory.newDocumentBuilder().newDocument();
marshaller.marshal(te, doc);
NodeList nodeList = doc.getDocumentElement().getChildNodes();
Node newNode = doc.createElement("ArrayOneWrapper");
List<Node> arrayOneElements = new ArrayList<>();
for (int i = 0; i < nodeList.getLength(); i++) {
Node n = nodeList.item(i);
if (n.getNodeName().equals("ArrayOne")) {
arrayOneElements.add(n);
}
}
for (Node n : arrayOneElements) {
newNode.appendChild(n);
}
XML输出:
<testElement>
<String>one</String>
<ArrayOneWrapper>
<ArrayOne>one</ArrayOne>
<ArrayOne>two</ArrayOne>
</ArrayOneWrapper>
</testElement>