3

コンテナが持つ属性のリストを含む POJO をどのように作成しますか?

通常、リストの POJO を作成するときは、次の方法で行います。

次の XML 構造を表すには:

<folder>
    <messages>
        <message>
            <subject>XXXX</subject>
            ...
        </message>
        <message>
            <subject>XXXX</subject>
            ...
        </message>
    </messages>
</folder>
@XmlRootElement(name = "folder")
public class Folder {
    @XmlElement
    private List<Message> messages;
    ...
}
@XmlRootElement(name = "message")
public class Message {
    @XmlElement
    private String subject;
    ...
}

しかし、messages タグに属性がある場合、POJO をどのように表現するのでしょうか? すなわち

<folder>
    <messages total="45" start="3">
        <message>
            <subject>XXXX</subject>
            ...
        </message>
        <message>
            <subject>XXXX</subject>
            ...
        </message>
    </messages>
</folder>

メッセージ専用の POJO を作成してから、List of Message を注釈@XmlValueまたはそれらの線に沿った何かでマップしますか?

助けてくれてありがとう。

4

2 に答える 2

2

次のアプローチは、任意のJAXB(JSR-222)実装で使用できます。

メッセージ

Messages標準のJAXB(JSR-222)APIのみを使用して、モデルにクラスを導入する必要があります。

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

public class Messages {

    @XmlElement(name="message")
    private List<Message> messages;

    @XmlAttribute
    private int start;

    @XmlAttribute
    public int getTotal() {
        if(null == messages) {
            return 0;
        } else {
            return messages.size();
        }
    }

}

フォルダ

Folder次に、新しいクラスを参照するようにクラスを変更する必要がありますMessages

import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Folder {

    private Messages messages;
}

メッセージ

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class Message {

    private String subject;

}
于 2013-01-17T10:10:26.467 に答える
1

注: 私はEclipseLink JAXB (MOXy)のリーダーであり、JAXB (JSR-222)エキスパート グループのメンバーです。

MOXy を JAXB プロバイダーとして使用する場合は、@XmlPath拡張機能を利用して次のことを行うことができます。

フォルダ

import java.util.List;
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Folder {

    @XmlElementWrapper
    @XmlElement(name="message")
    private List<Message> messages;

    @XmlPath("messages/@start")
    private int start;

    @XmlPath("messages/@total")
    public int getTotal() {
        if(null == messages) {
            return 0;
        } else {
            return messages.size();
        }
    }
}

メッセージ

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class Message {

    private String subject;

}

jaxb.properties

MOXy を JAXB プロバイダーとして指定するにはjaxb.properties、次のエントリを使用して、ドメイン モデルと同じパッケージで呼び出されるファイルを含める必要があります。

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

デモ

import java.io.File;
import javax.xml.bind.*;

public class Demo {

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

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum14372107/input.xml");
        Folder folder = (Folder) unmarshaller.unmarshal(xml);

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

}

input.xml/出力

<?xml version="1.0" encoding="UTF-8"?>
<folder>
   <messages start="1" total="2">
      <message>
         <subject>XXXX</subject>
      </message>
      <message>
         <subject>YYYY</subject>
      </message>
   </messages>
</folder>

詳細については

于 2013-01-17T10:04:41.727 に答える