1
public class Group {
    //many other fields
    public List<Person> persons;
}

public class Person {
    public String name; ...
}

当我编组时,我想获得一堆 Person 节点:

<person>
    <name>..</name>
</person>
<person>
    <name>..</name>
</person>

而不是这个:(一个以人节点为子节点的人节点)

<persons>
    <person>
      <name>..</name>
    </person>
    <person>
      <name>..</name>
    </person>
<persons>

我怎样才能做到这一点?

4

1 回答 1

1

更新

如果您指的persons是分组元素而不是根元素,则默认情况下JAXB (JSR-222)实现不会添加一个。

组(无分组元素)

package forum13305973;

import java.util.*;
import javax.xml.bind.annotation.*;

@XmlRootElement
public class Group {
    //many other fields
    @XmlElement(name="person")
    public List<Person> persons = new ArrayList<Person>();
}

package forum13305973;

public class Person {
    public String name;
}

演示

package forum13305973;

import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Group.class);

        Group group = new Group();

        Person person1 = new Person();
        person1.name = "Jane";
        group.persons.add(person1);

        Person person2 = new Person();
        person2.name = "John";
        group.persons.add(person2);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(group, System.out);
    }

}

输出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<group>
    <person>
        <name>Jane</name>
    </person>
    <person>
        <name>John</name>
    </person>
</group>

组(带分组元素)

您需要添加@XmlElementWrapper注释以获取分组元素

package forum13305973;

import java.util.*;

import javax.xml.bind.annotation.*;

@XmlRootElement
public class Group {
    //many other fields
    @XmlElementWrapper
    @XmlElement(name="person")
    public List<Person> persons = new ArrayList<Person>();
}

输出(带分组元素)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<group>
    <persons>
        <person>
            <name>Jane</name>
        </person>
        <person>
            <name>John</name>
        </person>
    </persons>
</group>

原始答案

您可以执行以下操作:

    JAXBContext jc = JAXBContext.newInstance(Person.class);
    Marshaller marshaller = jc.createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // format output
    marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true); // remove header

    for(Person person : group.persons) {
        marshaller.marshal(person, System.out);
    }
于 2012-11-09T11:02:10.243 回答