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 に答える