XStreamユーザーガイド:XMLからオブジェクトへの変換
1概要
/xstream-serialize-object-to-xml[前の記事]では、XStreamを使用してJavaオブジェクトをXMLにシリアル化する方法を学びました。このチュートリアルでは、その逆の方法を学びます。XMLをJavaオブジェクトに逆シリアル化します。
これらのタスクは、注釈を使用して、またはプログラム的に実行できます。
XStreamを設定するための基本的な要件とその依存関係については、前の記事を参照してください。
2 XMLからオブジェクトを逆シリアル化する
まず、次のXMLがあるとします。
<com.baeldung.pojo.Customer>
<firstName>John</firstName>
<lastName>Doe</lastName>
<dob>1986-02-14 03:46:16.381 UTC</dob>
</com.baeldung.pojo.Customer>
これをJavaの
Customer
オブジェクトに変換する必要があります。
public class Customer {
private String firstName;
private String lastName;
private Date dob;
//standard setters and getters
}
XMLは、
File
、
InputStream
、
Reader
、または
String
など、さまざまな方法で入力できます。簡単にするために、上記のXMLが
String
オブジェクトにあると仮定します。
Customer convertedCustomer = (Customer) xstream.fromXML(customerXmlString);
Assert.assertTrue(convertedCustomer.getFirstName().equals("John"));
3エイリアス
最初の例では、XMLは最外部のXMLタグ内のクラスの完全修飾名を持ち、
Customer
クラスの場所と一致します。
この設定により、XStreamは特別な設定なしでXMLを簡単に私たちのオブジェクトに変換します。しかし、私たちはいつもこれらの条件を持っているとは限りません。 XMLタグの命名を制御できないか、フィールドに別名を追加することにします。
たとえば、外部タグに完全修飾クラス名を使用しないようにXMLを変更したとします。
<customer>
<firstName>John</firstName>
<lastName>Doe</lastName>
<dob>1986-02-14 03:46:16.381 UTC</dob>
</customer>
エイリアスを作成することでこのXMLを変換できます。
プログラム的に、または注釈を使用して、エイリアスをXStreamインスタンスに登録します。
Customer
クラスに
@ XStreamAlias
というアノテーションを付けることができます。
@XStreamAlias("customer")
public class Customer {
//...
}
今度はこのアノテーションを使うようにXStreamインスタンスを設定する必要があります。
xstream.processAnnotations(Customer.class);
あるいは、プログラムでエイリアスを設定したい場合は、
以下のコードを使用してください。
xstream.alias("customer", Customer.class);
3.2. フィールドエイリアス
次のXMLがあるとします。
<customer>
<fn>John</fn>
<lastName>Doe</lastName>
<dob>1986-02-14 03:46:16.381 UTC</dob>
</customer>
fn
タグは、
Customer
オブジェクトのどのフィールドとも一致しません。そのため、シリアル化を解除する場合は、そのフィールドのエイリアスを定義する必要があります。これを実現するには、次のアノテーションを使用します。
@XStreamAlias("fn")
private String firstName;
あるいは、プログラムで同じ目標を達成することもできます。
xstream.aliasField("fn", Customer.class, "firstName");
4.
暗黙のコレクション
次のXMLがあり、
ContactDetails
の簡単なリストが含まれているとしましょう。
<customer>
<firstName>John</firstName>
<lastName>Doe</lastName>
<dob>1986-02-14 04:14:20.541 UTC</dob>
<ContactDetails>
<mobile>6673543265</mobile>
<landline>0124-2460311</landline>
</ContactDetails>
<ContactDetails>...</ContactDetails>
</customer>
Javaオブジェクトの
List <ContactDetails>
フィールドに
ContactDetails
のリストをロードします。これを実現するには、次のアノテーションを使用します。
@XStreamImplicit
private List<ContactDetails> contactDetailsList;
あるいは、プログラムで同じ目標を達成することもできます。
xstream.addImplicitCollection(Customer.class, "contactDetailsList");
5.
** フィールドを無視+
**
次のようなXMLがあるとしましょう。
<customer>
<firstName>John</firstName>
<lastName>Doe</lastName>
<dob>1986-02-14 04:14:20.541 UTC</dob>
<fullName>John Doe</fullName>
</customer>
上記のXMLでは、Javaの
Customer
オブジェクトにはない、余分な要素
<fullName>
があります。
余分な要素を気にせずに上記のXMLを逆シリアル化しようとすると、プログラムは
UnknownFieldException
をスローします。
No such field com.baeldung.pojo.Customer.fullName
例外が明確に述べているように、XStreamはフィールド
fullName
を認識しません。
この問題を克服するには、未知の要素を無視するように設定する必要があります。
xstream.ignoreUnknownElements();
6. 属性フィールド
オブジェクトのフィールドとして逆シリアル化したい要素の一部として属性を持つXMLがあるとします。
ContactDetails
オブジェクトに
contactType
属性を追加します。
<ContactDetails contactType="Office">
<mobile>6673543265</mobile>
<landline>0124-2460311</landline>
</ContactDetails>
contactType
XML属性を逆シリアル化する場合は、表示するフィールドに
@ XStreamAsAttribute
アノテーションを使用できます。
@XStreamAsAttribute
private String contactType;
あるいは、プログラムで同じ目標を達成することもできます。
xstream.useAttributeFor(ContactDetails.class, "contactType");
7. 結論
この記事では、XStreamを使用してXMLをJavaオブジェクトにデシリアライズするときに使用できるオプションについて説明しました。
この記事の完全なソースコードは、リンクされたhttps://github.com/eugenp/tutorials/tree/master/xstream[GitHub repository]からダウンロードできます。