Guide de l’utilisateur XStream: Conversion de XML en objets

XStream User Guide: Conversion de XML en objets

1. Vue d'ensemble

Dans unprevious article, nous avons appris à utiliser XStream pour sérialiser des objets Java en XML. Dans ce tutoriel, nous allons apprendre à faire l'inverse: désérialiser du XML vers des objets Java. Ces tâches peuvent être accomplies en utilisant des annotations ou par programme.

Pour en savoir plus sur les exigences de base pour la configuration de XStream et ses dépendances, veuillez vous reporter à l'article précédent.

2. Désérialiser un objet à partir de XML

Pour commencer, supposons que nous ayons le XML suivant:


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

Nous devons le convertir en un objet JavaCustomer:

public class Customer {

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

    // standard setters and getters
}

Le XML peut être saisi de plusieurs manières, notammentFile,InputStream,Reader ouString. Pour simplifier, nous supposerons que nous avons le XML ci-dessus dans un objetString.

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

3. Alias

Dans le premier exemple, le XML avait le nom complet de la classe dans la balise XML la plus externe, correspondant à l'emplacement de notre classeCustomer. Avec cette configuration, XStream convertit facilement le XML en notre objet sans configuration supplémentaire. Mais nous ne pouvons pas toujours avoir ces conditions. Nous pourrions ne pas avoir le contrôle sur la dénomination des balises XML ou décider d'ajouter des alias pour les champs.

Par exemple, supposons que nous ayons modifié notre code XML pour ne pas utiliser le nom de classe complet de la balise externe:


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

Nous pouvons convertir ce XML en créant des alias.

3.1. Alias ​​de classe

Nous enregistrons des alias avec l'instance XStream soit par programme, soit en utilisant des annotations. Nous pouvons annoter notre classeCustomer avec@XStreamAlias:

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

Nous devons maintenant configurer notre instance XStream pour utiliser cette annotation:

xstream.processAnnotations(Customer.class);

Alternativement, si nous souhaitons configurer un alias par programmation, nous pouvons utiliser le code ci-dessous: [line-through] **

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

3.2. Alias ​​de champ

Supposons que nous ayons le XML suivant:


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

La balisefn ne correspond à aucun champ de notre objetCustomer, nous devrons donc définir un alias pour ce champ si nous souhaitons le désérialiser. Nous pouvons y parvenir en utilisant l'annotation suivante:

@XStreamAlias("fn")
private String firstName;

Alternativement, nous pouvons atteindre le même objectif par programme:

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

4. Collections implicites

Disons que nous avons le XML suivant, contenant une simple liste deContactDetails:


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

Nous voulons charger la liste desContactDetails dans un champList<ContactDetails> de notre objet Java. Nous pouvons y parvenir en utilisant l'annotation suivante:

@XStreamImplicit
private List contactDetailsList;

Alternativement, nous pouvons atteindre le même objectif par programme:

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

5. Ignorer les champs

Disons que nous avons le XML suivant:


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

Dans le XML ci-dessus, nous avons un élément supplémentaire<fullName> qui est absent de notre objet JavaCustomer.

Si nous essayons de désérialiser le xml ci-dessus sans prendre soin de l'élément supplémentaire, le programme lance unUnknownFieldException.

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

Comme l'exception l'indique clairement, XStream ne reconnaît pas le champfullName.

Pour surmonter ce problème, nous devons le configurer pour ignorer des éléments inconnus:

xstream.ignoreUnknownElements();

6. Champs d'attribut

Supposons que nous ayons du XML avec des attributs dans le cadre d'éléments que nous souhaitons désérialiser en tant que champ dans notre objet. Nous allons ajouter un attributcontactType à notre objetContactDetails:


    6673543265
    0124-2460311

Si nous voulons désérialiser l’attribut XMLcontactType, nous pouvons utiliser l’annotation@XStreamAsAttribute sur le champ dans lequel nous voulons qu’il apparaisse:

@XStreamAsAttribute
private String contactType;

Alternativement, nous pouvons atteindre le même objectif par programme:

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

7. Conclusion

Dans cet article, nous avons exploré les options disponibles lors de la désérialisation d'objets XML vers Java à l'aide de XStream.

Le code source complet de cet article peut être téléchargé à partir desGitHub repository liés.