18

xml で名前空間を使用するのは初めてなので、ちょっと混乱しており、明確にしたいと思います。私は、さまざまな名前空間を持つ xml ドキュメントを受信して​​いる Java サービスを持っています。動作している間に、何か間違ったことをしたに違いないので、確認したいと思います。私の package-info.java には、次のようなスキーマ注釈があります。

@javax.xml.bind.annotation.XmlSchema(
    xmlns={
        @javax.xml.bind.annotation.XmHS(prefix="train", namespaceURI="http://mycompany/train"), 
        @javax.xml.bind.annotation.XmHS(prefix="passenger", namespaceURI="http://mycompany/passenger")
    }, 
    elementFormDefault = javax.xml.bind.annotation.XmlNsForm=QUALIFIED
)

クラスレベルで次の注釈が付けられたTrain.javaがあります。

@XmlRootElement(name="Train", namespace="http://mycompany/train")

クラスの各フィールドには、次の注釈が付けられています。

@XmlElement(name="Color") for example

列車には乗客のリストが含まれているため、プロパティがあります

private Set<Passenger> passengers;

このコレクションには次の注釈が付けられています。

@XmlElementWrapper(name="Passengers")
@XmlElements(@XmlElement(name="Passenger", namespace="http://mycompany/passenger"))

次に Passenger.java 内で、クラス自体に次の注釈が付けられます。

@XmlElement(name="Passenger", namespace="http://mycompany/passenger")

最後に、Passenger.java 内の個々のフィールドには、次のように注釈が付けられます。

@XmlElement(name="TicketNumber", namespace="http://mycompany/passenger")

したがって、次のようなxmlがある場合:

<train:Train>
   <train:Color>Red</train:Color>
   <train:Passengers>
       <train:Passenger>
           <passenger:TicketNumber>T101</passenger:TicketNumber>
       </train:Passenger>
   </train:Passengers>
</train:Train>

ここで、受け取ったこの xml をアンマーシャリングし、Train の Color プロパティが設定され、Passenger の TicketNumber プロパティが設定されます。しかし、それが機能するために TicketNumber の XmlElement 注釈に名前空間の URL を追加する必要がある理由はわかりませんが、Train の Color プロパティについてはそうする必要はありませんでした。TicketNumber の XmlElement 注釈から名前空間属性を削除すると、xml 要求から名前空間プレフィックスも削除しない限り、xml の値はオブジェクトにマップされません。Passenger の XmlRootElement で定義された名前空間属性を取得したので、Train の場合と同様に、クラスのすべてのフィールドに対してそれを行う必要はないはずです。何か間違った設定をしているに違いありません。誰かが私を正しい方向に向けることができますか? ありがとう!

4

1 に答える 1