programing

JAXB: 목록에 있는 물체들을 어떻게 모아야 합니까?

megabox 2023. 9. 11. 21:35
반응형

JAXB: 목록에 있는 물체들을 어떻게 모아야 합니까?

바보 같은 질문일 수도 있습니다.저는.List활자의<Data>XML 파일에 저장하고 싶습니다.이것은 나의 반입니다.Database가 들어 있는ArrayList...

@XmlRootElement
public class Database
{
    List<Data> records = new ArrayList<Data>();

    public List<Data> getRecords()                   { return records; }
    public void       setRecords(List<Data> records) { this.records = records; }
}

...여기는 클래스 데이터입니다.

// @XmlRootElement
public class Data 
{
    String name;
    String address;

    public String getName()            { return name;      }
    public void   setName(String name) { this.name = name; }

    public String getAddress()               { return address;         }
    public void   setAddress(String address) { this.address = address; }
}

다음 테스트 클래스를 사용하여...

public class Test
{
    public static void main(String args[]) throws Exception
    {
        Data data1 = new Data();
             data1.setName("Peter");
             data1.setAddress("Cologne");

        Data data2 = new Data();
             data2.setName("Mary");
             data2.setAddress("Hamburg");

        Database database = new Database();
                 database.getRecords().add(data1);
                 database.getRecords().add(data2);

        JAXBContext context = JAXBContext.newInstance(Database.class);
        Marshaller marshaller = context.createMarshaller();
                   marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
                   marshaller.marshal(database, new FileWriter("test.xml"));       
    }
}

...결과가 나왔습니다.

<database>
    <records>
        <address>Cologne</address>
        <name>Peter</name>
    </records>
    <records>
        <address>Hamburg</address>
        <name>Mary</name>
    </records>
</database>

하지만 그건 제가 기대했던 바가 아니에요, 예를 들어 모든 꼬리표가<Data>개체가 없습니다.다음과 같은 구조로 데이터를 내보낼 방법을 찾고 있지만 이를 달성하는 방법을 모르겠습니다.

<database>
    <records>
        <data>
            <address>Cologne</address>
            <name>Peter</name>
        </data>
        <data>
            <address>Hamburg</address>
            <name>Mary</name>
        </data>
    </records>
</database>

한 가지 추가 질문: 를 사용하지 않고 문제를 해결하려면@XmlElementWrapper그리고.@XmlElement주석, 나는 중급반을 소개할 수 있습니다.

public class Records
{
    List<Data> data = new ArrayList<Data>();

    public List<Data> getData()                { return data; }
    public void       setData(List<Data> data) { this.data = data; }
}

수정된 기본 클래스에서 사용됩니다.

@XmlRootElement
public class Database
{
    Records records = new Records();

    public Records getRecords()                { return records; }
    public void    setRecords(Records records) { this.records = records; }
}

약간 변형하여Test클래스:

...
Database database = new Database();
database.getRecords().getData().add(data1);
database.getRecords().getData().add(data2);
...

결과는 다음과 같습니다.

<database>
    <records>
        <data>
            <address>Cologne</address>
            <name>Peter</name>
        </data>
        <data>
            <address>Hamburg</address>
            <name>Mary</name>
        </data>
    </records>
</database>

위의 XML 파일 구조에 따라 자바 클래스 구조를 만드는 방법이 이것이 권장되는 방법입니까?

레코드 속성에 다음을 추가합니다.

@XmlElementWrapper(name="records")
@XmlElement(name="data")

JAXB 및 컬렉션 속성에 대한 자세한 내용은 다음을 참조하십시오.

두 번째 질문에서 답변이 누락된 것에 대한 답변입니다.

두 접근법 모두 동일한 XML을 생성합니다. 저는 당신의 응용에 가장 적합한 모델을 추천합니다.일반적으로 @XmlElementWrapper/@XmlElement를 사용하는 저의 경우."기록"은 단지 "데이터" 요소를 정리하기 위한 것이기 때문에, 그것은 그 자체의 클래스를 가질 자격이 없습니다.

저는 MOXy JAXB 구현을 주도하고 있으며, @XmlElementWrapper와 함께 사용할 수 있는 것을 뛰어넘는 XPath 기반 매핑 확장을 제공합니다.

두 번째 질문에 대한 답변:

Is this the recommended way to create a Java class structure
according to the XML file structure above?

엄밀히 말하면, 추가적인 것을 소개하는 것입니다.Records당신의 JAXB 문제를 해결하기 위한 수업은 불필요하고 중복적인 일입니다. 왜냐하면 JAXB는 그것을 필요로 하지 않기 때문입니다.@XmlElementWrapper그리고.@XmlElement name부동산은 당신의 문제를 해결하기 위해 설계되었습니다.

귀하의 의견부터 Blaise의 답변까지, 저는 List 등과 같은 일반 클래스를 다루는 방법을 설명하는 운영 예시와 함께 튜토리얼을 유지하고 있습니다.할 말이 없을 때

언급URL : https://stackoverflow.com/questions/3683598/jaxb-how-to-marshal-objects-in-lists

반응형