XStreamユーザーガイド:XMLからオブジェクトへの変換

XStreamユーザーガイド:XMLからオブジェクトへの変換

1. 概要

previous articleでは、XStreamを使用してJavaオブジェクトをXMLにシリアル化する方法を学びました。 このチュートリアルでは、逆の方法、つまりXMLをJavaオブジェクトにデシリアライズする方法を学びます。 これらのタスクは、注釈を使用して、またはプログラムで実行できます。

XStreamとその依存関係を設定するための基本的な要件については、前の記事を参照してください。

2. XMLからオブジェクトを逆シリアル化する

まず、次のXMLがあるとします。


    John
    Doe
    1986-02-14 03:46:16.381 UTC

これをJavaCustomerオブジェクトに変換する必要があります。

public class Customer {

    private String firstName;
    private String lastName;
    private Date dob;

    // standard setters and getters
}

XMLは、FileInputStreamReader、またはStringなどのさまざまな方法で入力できます。 簡単にするために、上記のXMLがStringオブジェクトにあると仮定します。

Customer convertedCustomer = (Customer) xstream.fromXML(customerXmlString);
Assert.assertTrue(convertedCustomer.getFirstName().equals("John"));

3. エイリアス

最初の例では、XMLの最も外側のXMLタグにクラスの完全修飾名があり、Customerクラスの場所と一致しています。 この設定により、XStreamは余分な構成を行うことなく、XMLを簡単にオブジェクトに変換します。 しかし、これらの条件が常にあるとは限りません。 XMLタグの名前付けを制御できない場合や、フィールドのエイリアスを追加する場合があります。

たとえば、外部タグに完全修飾クラス名を使用しないようにXMLを変更したとします。


    John
    Doe
    1986-02-14 03:46:16.381 UTC

エイリアスを作成することで、このXMLを変換できます。

3.1. クラスエイリアス

プログラムまたはアノテーションを使用して、エイリアスをXStreamインスタンスに登録します。 Customerクラスに@XStreamAliasで注釈を付けることができます。

@XStreamAlias("customer")
public class Customer {
    //...
}

次に、このアノテーションを使用するようにXStreamインスタンスを構成する必要があります。

xstream.processAnnotations(Customer.class);

または、プログラムでエイリアスを構成する場合は、次のコードを使用できます。[line-through] **

xstream.alias("customer", Customer.class);

3.2. フィールドエイリアス

次のXMLがあるとします。


    John
    Doe
    1986-02-14 03:46:16.381 UTC

fnタグは、Customerオブジェクトのどのフィールドとも一致しないため、逆シリアル化する場合は、そのフィールドのエイリアスを定義する必要があります。 次の注釈を使用してこれを実現できます。

@XStreamAlias("fn")
private String firstName;

または、同じ目標をプログラムで達成することもできます。

xstream.aliasField("fn", Customer.class, "firstName");

4. 暗黙のコレクション

ContactDetailsの単純なリストを含む次のXMLがあるとします。


    John
    Doe
    1986-02-14 04:14:20.541 UTC
    
        6673543265
        0124-2460311
    
    ...

ContactDetailsのリストをJavaオブジェクトのList<ContactDetails>フィールドにロードします。 これを実現するには、次の注釈を使用します。

@XStreamImplicit
private List contactDetailsList;

または、同じ目標をプログラムで達成することもできます。

xstream.addImplicitCollection(Customer.class, "contactDetailsList");

5. フィールドを無視する

次のXMLがあるとしましょう。


    John
    Doe
    1986-02-14 04:14:20.541 UTC
    John Doe

上記のXMLには、JavaCustomerオブジェクトから欠落している余分な要素<fullName>があります。

余分な要素を気にせずに上記のxmlを逆シリアル化しようとすると、プログラムはUnknownFieldExceptionをスローします。

No such field com.example.pojo.Customer.fullName

例外が明確に述べているように、XStreamはフィールドfullNameを認識しません。

この問題を克服するには、未知の要素を無視するように設定する必要があります。

xstream.ignoreUnknownElements();

6. 属性フィールド

オブジェクトのフィールドとして逆シリアル化する要素の一部として属性を持つXMLがあるとします。 ContactDetailsオブジェクトにcontactType属性を追加します。


    6673543265
    0124-2460311

contactType XML属性を逆シリアル化する場合は、表示するフィールドで@XStreamAsAttributeアノテーションを使用できます。

@XStreamAsAttribute
private String contactType;

または、同じ目標をプログラムで達成することもできます。

xstream.useAttributeFor(ContactDetails.class, "contactType");

7. 結論

この記事では、XStreamを使用してXMLをJavaオブジェクトにデシリアライズするときに使用できるオプションを調べました。

この記事の完全なソースコードは、リンクされたGitHub repositoryからダウンロードできます。