我有一些对象,假设两个,A和B。这些对象来自同一类。我需要使用 JAXB 封送这些对象,输出 XML 应采用以下形式:
<Root>
<A>
<ID> an id </ID>
</A>
<B>
<ID> an id </ID>
</B>
</Root>
<!-- Then all A and B attributes must be listed !-->
<A>
<ID> an id </ID>
<attribute1> value </attribute1>
<attribute2> value </attribute2>
</A>
<B>
<ID> an id </ID>
<attribute1> value </attribute1>
<attribute2> value </attribute2>
</B>
如何在 JAXB 中生成此格式?任何帮助,不胜感激。
更新:更具体地说,假设我们有这样的 Human 类:
@XmlRootElement
public class Human {
private String name;
private int age;
private Integer nationalID;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Integer getNationalID() {
return nationalID;
}
public void setNationalID(Integer nationalID) {
this.nationalID = nationalID;
}
}
我们的主要课程是:
public class Main3 {
public static void main(String[] args) throws JAXBException {
Human human1 = new Human();
human1.setName("John");
human1.setAge(24);
human1.setNationalID(Integer.valueOf(123456789));
JAXBContext context = JAXBContext.newInstance(Human.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
StringWriter stringWriter = new StringWriter();
m.marshal(human1, stringWriter);
System.out.println(stringWriter.toString());
}
}
然后输出将是:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<human>
<age>24</age>
<name>John</name>
<nationalID>123456789</nationalID>
</human>
现在我需要输出是这样的:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<human>
<nationalID>123456789</nationalID>
</human>
<human>
<nationalID>123456789</nationalID>
<age>24</age>
<name>John</name>
</human>
这将帮助我绘制一个没有属性(仅按 ID)的 XML 对象树,然后是树下的所有定义。使用 JAXB 或任何其他实现是否可以做到这一点?
试试这个:
import java.io.StringWriter;
import javax.xml.bind.Marshaller;
...
Object requestObject = ... // This is the object that needs to be printed with indentation
Marshaller marshaller = ...
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
StringWriter stringWriter = new StringWriter();
marshaller.marshal(requestObject, stringWriter);
System.out.println(stringWriter.toString());
package com.namasoft.dms.gui.common.utilities;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlAccessorOrder;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlID;
import javax.xml.bind.annotation.XmlIDREF;
import javax.xml.bind.annotation.XmlRootElement;
public class JAXB
{
public static class Human
{
@XmlID
String id;
@XmlElement
String name;
@XmlElement
int age;
public Human()
{
}
public Human(String name)
{
this.id = this.name = name;
age = new Random().nextInt();
}
}
@XmlRootElement
public static class HumansList
{
@XmlElementWrapper(name = "humanObjects")
@XmlElement(name = "human")
List<Human> humanObjects = new ArrayList<>();
@XmlIDREF
@XmlElementWrapper(name = "humanIds")
@XmlElement(name = "id")
List<Human> humanIds = new ArrayList<>();
void addHuman(Human human)
{
humanObjects.add(human);
humanIds.add(human);
}
}
public static void main(String[] args) throws JAXBException
{
HumansList list = new HumansList();
Human parent1 = new Human("parent1");
list.addHuman(parent1);
Human child11 = new Human("child11");
list.addHuman(child11);
Human child12 = new Human("child12");
list.addHuman(child12);
Human parent2 = new Human("parent2");
list.addHuman(parent2);
Human child21 = new Human("child21");
list.addHuman(child21);
Human child22 = new Human("child22");
list.addHuman(child22);
JAXBContext context = JAXBContext.newInstance(HumansList.class);
Marshaller m = context.createMarshaller();
StringWriter xml = new StringWriter();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
m.marshal(list, xml);
System.out.println(xml);
}
}
输出将是
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<humansList>
<humanObjects>
<human>
<id>parent1</id>
<name>parent1</name>
<age>-486071665</age>
</human>
<human>
<id>child11</id>
<name>child11</name>
<age>920318383</age>
</human>
<human>
<id>child12</id>
<name>child12</name>
<age>-1355111983</age>
</human>
<human>
<id>parent2</id>
<name>parent2</name>
<age>-314154051</age>
</human>
<human>
<id>child21</id>
<name>child21</name>
<age>983544381</age>
</human>
<human>
<id>child22</id>
<name>child22</name>
<age>748252616</age>
</human>
</humanObjects>
<humanIds>
<id>parent1</id>
<id>child11</id>
<id>child12</id>
<id>parent2</id>
<id>child21</id>
<id>child22</id>
</humanIds>
</humansList>