Panduan Pengguna XStream: Menukar XML ke Objek

1. Gambaran keseluruhan

Dalam artikel sebelumnya, kami belajar bagaimana menggunakan XStream untuk menyusun objek Java ke XML. Dalam tutorial ini, kita akan belajar bagaimana melakukan sebaliknya: deserialize XML ke objek Java. Tugas-tugas ini dapat diselesaikan dengan menggunakan anotasi atau secara terprogram.

Untuk mengetahui tentang keperluan asas untuk mengatur XStream dan pergantungannya, sila rujuk artikel sebelumnya.

2. Mendesialisasikan Objek dari XML

Sebagai permulaan, anggaplah kita mempunyai XML berikut:

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

Kita perlu mengubahnya menjadi objek Pelanggan Java :

public class Customer { private String firstName; private String lastName; private Date dob; // standard setters and getters } 

XML dapat dimasukkan dalam beberapa cara, termasuk File , InputStream , Reader , atau String . Untuk kesederhanaan, kami akan menganggap bahawa kami mempunyai XML di atas dalam objek String .

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

3. Alias

Dalam contoh pertama, XML mempunyai nama kelas yang memenuhi syarat sepenuhnya dalam teg XML terluar, yang sesuai dengan lokasi kelas Pelanggan kami . Dengan persediaan ini, XStream menukar XML ke objek kita dengan mudah tanpa konfigurasi tambahan. Tetapi kita mungkin tidak selalu mempunyai syarat ini. Kami mungkin tidak mempunyai kawalan terhadap penamaan tag XML, atau kami mungkin memutuskan untuk menambahkan alias untuk bidang.

Sebagai contoh, andaikan kita mengubahsuai XML kita agar tidak menggunakan nama kelas yang memenuhi syarat untuk teg luar:

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

Kami dapat menyembunyikan XML ini dengan membuat alias.

3.1. Alias ​​Kelas

Kami mendaftarkan alias dengan instance XStream sama ada secara terprogram atau menggunakan anotasi. Kami dapat memberi penjelasan kepada kelas Pelanggan kami dengan @XStreamAlias :

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

Sekarang kita perlu mengkonfigurasi instance XStream kami untuk menggunakan anotasi ini:

xstream.processAnnotations(Customer.class);

Sebagai alternatif, jika kita ingin mengkonfigurasi alias secara terprogram, kita boleh menggunakan kod di bawah:

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

3.2. Alias ​​Bidang

Katakan kita mempunyai XML berikut:

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

The fn tag tidak sepadan sebarang medan dalam kita Pelanggan objek, jadi kita perlu menentukan alias untuk medan bahawa jika kita ingin deserialize ia. Kami dapat mencapainya dengan menggunakan penjelasan berikut:

@XStreamAlias("fn") private String firstName;

Sebagai alternatif, kita dapat mencapai matlamat yang sama secara terprogram:

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

4. Koleksi Tersirat

Katakan kita mempunyai XML berikut, yang mengandungi senarai ContactDetails ringkas :

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

Kita mahu untuk memuatkan senarai ContactDetails ke dalam Senarai bidang dalam objek Java kami. Kami dapat mencapainya dengan menggunakan penjelasan berikut:

@XStreamImplicit private List contactDetailsList;

Sebagai alternatif, kita dapat mencapai matlamat yang sama secara terprogram:

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

5. Abaikan Medan

Katakan kita mengikuti XML:

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

Dalam XML di atas, kami mempunyai elemen tambahan yang hilang dari objek Pelanggan Java kami .

Sekiranya kita cuba mendeserialisasikan xml di atas tanpa mengambil perhatian terhadap elemen tambahan, program membuang UnknownFieldException .

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

Seperti pengecualian yang dinyatakan dengan jelas, XStream tidak mengenali nama penuh nama .

Untuk mengatasi masalah ini, kita perlu mengkonfigurasinya untuk mengabaikan elemen yang tidak diketahui:

xstream.ignoreUnknownElements();

6. Medan Atribut

Anggaplah kita memiliki XML dengan atribut sebagai bagian dari elemen yang ingin kita deserialisasi sebagai medan dalam objek kita. Kami akan menambahkan atribut contactType ke objek ContactDetails kami :

 6673543265 0124-2460311 

Sekiranya kita ingin mendeserialisasikan atribut contactType XML, kita dapat menggunakan anotasi @XStreamAsAttribute di medan yang ingin kita muncul dalam:

@XStreamAsAttribute private String contactType;

Sebagai alternatif, kita dapat mencapai matlamat yang sama secara terprogram:

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

7. Kesimpulannya

Dalam artikel ini, kami meneroka pilihan yang kami miliki ketika mendeserisasi XML ke objek Java menggunakan XStream.

Kod sumber lengkap untuk artikel ini boleh dimuat turun dari repositori GitHub yang dipautkan.