Java >> Java チュートリアル >  >> Java

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 ノードをクラスの非静的フィールドにマップします。この例では、要素 Prado Museum をクラス Museum のフィールド名にマッピングします。 アノテーション @XmlElement( name = "MUSEUM_NAME" ) の使用 setName()
このメソッドの詳細については、XMLElement を参照してください。

@XmlAttribute :この注釈は、XML 属性をクラスの非静的フィールドにマップします。次のコードを使用して、Museum クラスの childrenAllowed フィールドを xml 属性 にバインドします:

 @XmlAttribute( name = "children_allowed" )
 public void setChildrenAllowed( Boolean childrenAllowed )
 {
 this.childrenAllowed = childrenAllowed;
 }

注釈 @XmlAttribute の詳細については、 XMLAttribute に移動します。

これが、XML ファイルを Java オブジェクトに非整列化する方法です。

JAXB には、コレクションをマーシャリングおよびアンマーシャリングする方法がいくつか用意されています。この例では、Museum アイテムのリストを含む Museums クラスを作成したので、JAXB は上記のアノテーションを使用するだけでこのクラスを直接管理できます。注釈 @XmlElementWrapper を使用して同様のことを達成することも可能です または @XmlList 、しかし私の見解では、これらはより複雑で、オプションが少なく、クラスモデリングでいくつかの方法であなたを結びつける.

記事でも紹介したように、XSD (XML Schmema Definition) を利用して JAXB アノテーション付きの Java クラスを自動生成することも可能です。これにより、アンマーシャルしたい提供された XML スキーマに対して XML ファイルを検証することもできます。また、JAXB が動作するために XSD を必要としないことも重要です (この例で見たように)。これにより、Java プログラマーに多くの柔軟性がもたらされます。

この記事で説明するすべてのコードと実行例の一部は、次のリンクにあります:unmarshall.zip

Java タグ