1

JAXB を使用して、一部の XML を Java マップに非整列化しようとしています。

Sun/Oracle が提供する JAXB 参照実装 (com.sun.xml.internal.bind...) を使用していると思います。

以下は、インスタンス ファイルからの関連する XML の (省略された) 部分です。

<Report 
    xmlns="http://www.escholar.com/eReports" 
    path="Books" reportName="BooksRead" eTag="eTag value">

    <SelectList>
        <entry>
           <key>DOC</key>
           <value>Microsoft Word (DOC)</value>
        </entry>
        <entry>
           <key>PDF</key>
           <value>Adobe Portable Document Format (PDF)</value>
        </entry>
    </Selectlist>
.
.
.
</Report>

ご覧のとおり、すべての要素が名前空間にあります。

selectList の注釈付き Java フィールドは次のとおりです。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "InputSelectionType", namespace=ReportJAXB.NAMESPACE, propOrder = {
"selectList"
})

public class InputSelectionTypeJAXB extends InputParameterTypeJAXB 
                                    implements InputSelectionType
    {
    @XmlElementWrapper(name="SelectList", namespace=ReportJAXB.NAMESPACE)
    protected LinkedHashMap<String, String> selectList;

ReportJAXB.NAMESPACE の定義は次のとおりです (インスタンス ファイル @xmlns と同じ)。

    protected final static String NAMESPACE = "http://www.escholar.com/eReports";

selectListマップに要素がなくなることを除いて、アプリケーション内のすべてが非整列化に関して正常に機能しています。

名前空間を追加するまで、これはすべて正常に機能したことにも言及する価値があります。

問題はentrykey、およびvalueタグに関係していると思います。これらは私が選んだタグ名ではありません。これらは、Java Map に非整列化するときに JAXB が想定するタグ名です。名前空間を導入する前に、マーシャリングされた出力を調べることでそれらを発見しました。

したがって、これらのタグがインスタンスファイルの名前空間にあるため、これが機能しない理由が最も推測されますが、 @XmlElementWrapper 注釈で提供する名前空間は、それらの暗黙のタグによって継承されません。

これが他のコレクション (リストなど) である場合は、グループ化リスト要素の直接の子に @XmlElement で注釈を付けることができます。ただし、マップにはこれらの暗黙のサブ構造/サブ要素があります。

これを修正するにはどうすればよいですか?

4

1 に答える 1

1

JAXB (JSR-222)実装は、コレクション クラス ( など) ではなく、ドメインjava.util.Mapオブジェクトのタイプ ( 、 など) として。これは、1 つのマッピングのみを作成することを意味します。そのため、ドメイン モデルから名前空間修飾を継承せず、名前空間修飾されていません。モデルのインスタンスを作成してマーシャリングすると、これが何を意味するかがわかります。CustomerAddressjava.util.List

の XML 表現をMap名前空間で修飾したい場合は、 を利用XmlAdapterしてこれを行うことができます。

于 2013-01-28T19:21:15.830 に答える