XStream Brugervejledning: Konvertering af XML til objekter

1. Oversigt

I en tidligere artikel lærte vi, hvordan man bruger XStream til at serialisere Java-objekter til XML. I denne vejledning lærer vi, hvordan man gør det modsatte: deserialisering af XML til Java-objekter. Disse opgaver kan udføres ved hjælp af annoteringer eller programmatisk.

For at lære om de grundlæggende krav til opsætning af XStream og dens afhængigheder henvises til den foregående artikel.

2. Deserialiser et objekt fra XML

Til at begynde med antager vi, at vi har følgende XML:

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

Vi er nødt til at konvertere dette til en Java Kunde objekt:

offentlig klasse kunde {privat streng fornavn; privat streng efternavn; private Date dob; // standard settere og getters} 

XML kan indtastes på en række måder, herunder Fil, InputStream, Læser, eller Snor. For nemheds skyld antager vi, at vi har XML ovenfor i a Snor objekt.

Kunde konverteretKunde = (Kunde) xstream.fromXML (customerXmlString); Assert.assertTrue (convertCustomer.getFirstName (). Er lig med ("John"));

3. Aliaser

I det første eksempel havde XML klassen fuldt kvalificerede navn i det yderste XML-tag, der matchede placeringen af ​​vores Kunde klasse. Med denne opsætning konverterer XStream let XML til vores objekt uden nogen ekstra konfiguration. Men vi har måske ikke altid disse betingelser. Vi har muligvis ikke kontrol over XML-tagnavnet, eller vi beslutter måske at tilføje aliaser for felter.

Antag for eksempel, at vi har ændret vores XML for ikke at bruge det fuldt kvalificerede klassenavn til det ydre tag:

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

Vi kan skjule denne XML ved at oprette aliaser.

3.1. Klassealiaser

Vi registrerer aliaser med XStream-forekomsten enten programmatisk eller ved hjælp af kommentarer. Vi kan kommentere vores Kunde klasse med @XStreamAlias:

@XStreamAlias ​​("kunde") kunde i offentlig klasse {// ...}

Nu skal vi konfigurere vores XStream-forekomst til at bruge denne kommentar:

xstream.processAnnotations (kunde.klasse);

Alternativt, hvis vi ønsker at konfigurere et alias programmatisk, kan vi bruge koden nedenfor:

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

3.2. Markaliaser

Antag, at vi har følgende XML:

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

Det fn tag matcher ikke nogen felter i vores Kunde objekt, så vi bliver nødt til at definere et alias for det felt, hvis vi ønsker at deserialisere det. Vi kan opnå dette ved hjælp af følgende kommentar:

@XStreamAlias ​​("fn") privat streng fornavn;

Alternativt kan vi opnå det samme mål programmatisk:

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

4. Implicitte samlinger

Lad os sige, at vi har følgende XML, der indeholder en simpel liste over Kontaktoplysninger:

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

Vi vil indlæse listen over Kontaktoplysninger ind i en Liste felt i vores Java-objekt. Vi kan opnå dette ved at bruge følgende kommentar:

@XStreamImplicit privat liste contactDetailsList;

Alternativt kan vi opnå det samme mål programmatisk:

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

5.Ignorer felter

Lad os sige, at vi har følgende XML:

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

I XML ovenfor har vi ekstra element der mangler i vores Java Kunde objekt.

Hvis vi forsøger at deserialisere ovenstående xml uden at tage os af ekstra element, kaster programmet en UnknownFieldException.

Intet sådant felt com.baeldung.pojo.Customer.fullName

Som undtagelsen tydeligt siger, genkender XStream ikke feltet fulde navn.

For at løse dette problem er vi nødt til at konfigurere det til at ignorere ukendte elementer:

xstream.ignoreUnknownElements ();

6. Attributfelter

Antag, at vi har XML med attributter som en del af elementer, som vi gerne vil deserialisere som et felt i vores objekt. Vi tilføjer en contactType attribut til vores Kontaktoplysninger objekt:

 6673543265 0124-2460311 

Hvis vi ønsker at deserialisere contactType XML-attribut, kan vi bruge @XStreamAsAttribute kommentar på det felt, vi gerne vil have, at den skal vises i:

@XStreamAsAttribute private String contactType;

Alternativt kan vi opnå det samme mål programmatisk:

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

7. Konklusion

I denne artikel undersøgte vi de muligheder, vi har til rådighed ved deserialisering af XML til Java-objekter ved hjælp af XStream.

Den komplette kildekode til denne artikel kan downloades fra det linkede GitHub-arkiv.