JAXB 非整列化の例
前回の記事では、JAXB を使用して Java オブジェクトを xml にマーシャリングする方法を説明しました。ここでは、補完的な操作を行う方法を見ていきます。つまり、xml ファイルを Java オブジェクトにアンマーシャリングし、この操作を行う際に考慮すべきことです。
この目的のために、マーシャルの例の記事と同じ例を使用します。主な展覧会とアーティストが公開されている博物館のリストに関する情報を含む xml を非整列化します。
これらの例で使用されている Java バージョンは JRE 1.8.0 です。使用される IDE は Eclipse SDK バージョン:Luna (4.4) ですが、コードは Java をサポートする他の IDE でも動作するはずです。
以下に示すコードは、指定された xml ファイルを Java オブジェクトに非整列化します。これらのオブジェクトのクラスには、一連の属性と注釈が含まれている必要があります:
XML ファイル:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <MUSEUMS> <MUSEUM children_allowed="false"> <MUSEUM_NAME>Reina Sofia Museum</MUSEUM_NAME> <CITY>Madrid</CITY> <PERMANENT_EXHIBITION> <NAME>Permanent Exhibition - Reina Sofia Museum</NAME> <ARTIST>Picasso</ARTIST> <ARTIST>Dali</ARTIST> <ARTIST>Miro</ARTIST> <FROM>1900-01-01</FROM> <TO>2014-12-31</TO> </PERMANENT_EXHIBITION> </MUSEUM> <MUSEUM> <MUSEUM_NAME>Louvre Museum</MUSEUM_NAME> <CITY>Paris</CITY> <PERMANENT_EXHIBITION> <NAME>Permanent Exhibition - Louvre Museum</NAME> <ARTIST>Leonardo da Vinci</ARTIST> <ARTIST>Caravaggio</ARTIST> <ARTIST>Delacroix</ARTIST> </PERMANENT_EXHIBITION> </MUSEUM> </MUSEUMS>
および Java メイン プログラム:
File file = new File("museums.xml"); JAXBContext jaxbContext = JAXBContext.newInstance(Museums.class); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); Museums museums = (Museums) jaxbUnmarshaller.unmarshal(file); System.out.println(museums);
生成される出力は次のようになります:
Name: Prado Museum City: Madrid Permanent Exhibition - Prado Museum Game of Bowls (1908), by Henri Matisse Name: Reina Sofia Museum City: Madrid ATTENTION! Children are not allowed in this museum Permanent Exhibition - Reina Sofia Museum Name: British Museum City: London Permanent Exhibition - British Museum Name: MOMA City: New York Permanent Exhibition - MOMA Name: Louvre Museum City: Paris Permanent Exhibition - Louvre Museum
ただし、これは Museums
を処理する現在の Java コードに依存します。 クラス。
メソッド createUnmarshaller
クラス JAXBContext
の タイプ Unmarshaller
のインスタンスを作成します これにより、タスクを進めることができます。クラス Museums
の場合 そのメンバーが適切な JAXB アノテーションとフィールド メンバーを使用して適切に構成されていれば、すべて正常に動作するはずです。
Museums クラスには、Museum アイテムのリストが含まれています:
@XmlRootElement( name = "MUSEUMS" ) public class Museums { List museums; /** * element that is going to be marshaled in the xml */ @XmlElement( name = "MUSEUM" ) public void setMuseums( List museums ) { this.museums = museums; } ...
また、Museum クラスには、名前や都市などの XML 要素、または児童手当などの XML 属性であるフィールドが含まれています。これらのフィールドは、JAXB がサポートする任意の型にすることができます:
@XmlType( propOrder = { "name", "city", "permanent", "special" } ) @XmlRootElement( name = "MUSEUM" ) public class Museum { String name; @XmlElement( name = "MUSEUM_NAME" ) public void setName( String name ) { this.name = name; } Boolean childrenAllowed; @XmlAttribute( name = "children_allowed") public void setChildrenAllowed( Boolean childrenAllowed ) { this.childrenAllowed = childrenAllowed; } Exhibition special; @XmlElement( name = "SPECIAL_EXHIBITION" ) public void setSpecial( Exhibition special ) { this.special = special; } ...
サポートされていないタイプのフィールドを使用する場合は、この種のオブジェクトを管理する方法を JAXB に示す Adapter を実装する必要があります。このアダプタは XmlAdapter
を拡張します クラスとその marshal
を実装します と unmarshal
メソッド:
public class LocalDateAdapter extends XmlAdapter { public LocalDate unmarshal( String v ) throws Exception { return LocalDate.parse( v ); } public String marshal( LocalDate v ) throws Exception { return v.toString(); } }
このアダプターは次のように使用されます:
@XmlJavaTypeAdapter( LocalDateAdapter.class ) @XmlElement( name = "FROM" ) public void setFrom( LocalDate from ) { this.from = from; }
使用した主な注釈
使用されるクラスの構成と JAXB の構成に使用される注釈に関連するいくつかの重要なポイントを見ていきます。
@XmlRootElement
:この注釈は、XML ノードをクラスまたは列挙型にバインドします。この例では、@XmlRootElement
を使用してバインドします 、このクラスに @XmlRootElement( name = "MUSEUMS" )
の注釈を付けることにより、クラス Museums を持つ XML 要素
この注釈の詳細については、XMLRootElement を参照してください。
@XmlElement
:XML ノードをクラスの非静的フィールドにマップします。この例では、要素 Museum
のフィールド名にマッピングします。 アノテーション @XmlElement( name = "MUSEUM_NAME" )
の使用 setName()
で
このメソッドの詳細については、XMLElement を参照してください。
注釈
これが、XML ファイルを Java オブジェクトに非整列化する方法です。
JAXB には、コレクションをマーシャリングおよびアンマーシャリングする方法がいくつか用意されています。この例では、Museum アイテムのリストを含む Museums クラスを作成したので、JAXB は上記のアノテーションを使用するだけでこのクラスを直接管理できます。注釈
記事でも紹介したように、XSD (XML Schmema Definition) を利用して JAXB アノテーション付きの Java クラスを自動生成することも可能です。これにより、アンマーシャルしたい提供された XML スキーマに対して XML ファイルを検証することもできます。また、JAXB が動作するために XSD を必要としないことも重要です (この例で見たように)。これにより、Java プログラマーに多くの柔軟性がもたらされます。
この記事で説明するすべてのコードと実行例の一部は、次のリンクにあります:unmarshall.zip @XmlAttribute
:この注釈は、XML 属性をクラスの非静的フィールドにマップします。次のコードを使用して、Museum クラスの childrenAllowed フィールドを xml 属性 @XmlAttribute( name = "children_allowed" )
public void setChildrenAllowed( Boolean childrenAllowed )
{
this.childrenAllowed = childrenAllowed;
}
@XmlAttribute
の詳細については、 XMLAttribute に移動します。 @XmlElementWrapper
を使用して同様のことを達成することも可能です または @XmlList
、しかし私の見解では、これらはより複雑で、オプションが少なく、クラスモデリングでいくつかの方法であなたを結びつける.