Skip to main content

Công Cụ XStream Dùng Chuyển Đối Tượng Của Lớp Java Qua Dạng XML Hay Ngược Lại

Giới Thiệu - XStream là một công cụ giúp chuyển các đối tượng hay những thể hiện của những lớp Java qua dạng XML hay ngược lại. Nó là một mã nguồn mở, được thiết lập từ tháng giêng năm 2004.

Trong một đề án IT đôi khi bạn cần phải chuyển các đối tưọng của các lớp Java có chứa thông tin và đưa nó qua dạng XML. Việc làm này để giúp mang thông tin từ hệ thống này qua hệ thống khác bằng những gói hay tập tin XML (giả sử các hệ thống này viết bằng ngôn ngữ Java).  Nó cũng giúp bạn tránh được nhiều phiền toái như cách sắp đặt chuyển kiểu cho hai dữ liệu giữa hai hệ thống. Do đó dùng dạng XML như là phương tiện trao đổi dữ liệu giữa hai hệ thống là cách hữu hiệu nhất.  Sau khi hệ thống đã nhận được dữ liệu nằm ở dạng XML rồi, thì việc kế tiếp là người lập trình chỉ chuyển chúng về các đối tượng Java để phù hợp với ngôn ngữ mà hệ thống đó đang dùng.  Công cụ XStream giúp bạn thực hiện được giải pháp vừa nói ở trên.  Nếu bạn không dùng XML như là phương tiện trao đổi dữ liệu, thì trong Java cũng có cách đưa đối tượng Java từ nơi này sang nơi khác là dùng Serialize. Bài này không nói đến Serialize, mà chỉ nói đến công cụ XStream.  Tiện đây, cũng nên biết Castor, một công cụ có chức năng giống như XStream, sẽ được bàn vào bài viết khác.

Tải Thư Viện XStream

Muốn sử dụng XStream, trước hết bạn cần thư viện của nó, gồm tập tin tên xstream-distribution-1.3.1-bin.zip, tải từ trang web http://xstream.codehaus.org/index.html. Chú ý: phiên bản mới nhất khi viết bài này là 1.3.1. Sau khi tải xong, bạn cần bung tập tin zip này xuất ra một thư mục, sau đó bạn vào thư mục con có tên lib và lấy ra hai tập tin: xstream-1.3.1.jar và xpp3_min-1.1.4c.jar.  Hai tập tin này sẽ được dùng trong bất kỳ đề án của bạn nếu bạn muốn sử dụng công cụ XStream.

Thí Dụ Cách Dùng XStream

Thí dụ phần này là dựa một phần vào bài tutorial (2 phút) của trang web XStream. Phần còn lại là cách viết của trang web Viet SMS.   (Chú ý: Bài viết này không phải là bài dịch của trang XStream. Người viết chỉ lấy ví dụ để làm sáng tỏ cách dùng XStream theo kinh nghiệm, và bạn đọc dễ dàng kiểm chứng dựa vào thí dụ mà XStream đưa ra).  Đầu tiên bạn tạo ra lớp có tên là PhoneNumber và Person.  Sự liên hệ giữa hai lớp này là một person có một hoặc nhiều điện thoại.  Sau đó bạn viết một chương trình Java có tên là TestXStream để gọi các thủ tục được định sẵn trong thư viện XStream ngõ hầu giúp chúng ta hiểu cách chuyển những đối tượng hay thể hiện của 2 lớp PhoneNumber và Person này thành dạng XML, hoặc làm ngược lại: Chuyển dữ liệu ở dạng XML thành đối tượng của lớp PersonNumber và Person.  Bạn chú ý rằng dạng XML có cấu trúc là do các thuộc tính được định nghĩa ở trong các lớp PersonNumber và Person.
 
Tạo ra lớp PhoneNumber có tập tin tên là PhoneNumber.java
 
public class PhoneNumber {
 
      private int code;
      private String number;
     
      PhoneNumber(int code, String number){
            this.code = code;
            this.number = number;
      }
     
      public int getCode() {
            return code;
      }
      public void setCode(int code) {
            this.code = code;
      }
      public String getNumber() {
            return number;
      }
      public void setNumber(String number) {
            this.number = number;
      }
}
  
 
Tạo ra lớp Person có tập tin tên là Person.java
 
public class Person {
 
      private String firstName;
      private String lastName;
      private PhoneNumber phone;
      private PhoneNumber fax;
     
      Person(String firstName, String lastName){
            this.firstName = firstName;
            this.lastName = lastName;
      }
     
      public String getFirstName() {
            return firstName;
      }
      public void setFirstName(String firstName) {
            this.firstName = firstName;
      }
      public String getLastName() {
            return lastName;
      }
      public void setLastName(String lastName) {
            this.lastName = lastName;
      }
      public PhoneNumber getPhone() {
            return phone;
      }
      public void setPhone(PhoneNumber phone) {
            this.phone = phone;
      }
      public PhoneNumber getFax() {
            return fax;
      }
      public void setFax(PhoneNumber fax) {
            this.fax = fax;
      }
}
 
Tạo ra lớp chương trình TestXStream có tập tin tên là TestXStream.java 
 
import com.thoughtworks.xstream.XStream;
 
public class TestXStream {
 
      /**
       *@paramargs
       */
      public static void main(String[] args) {
            XStream xstream = new XStream();
           
            Person joe = new Person("Joe", "Walnes");
            joe.setPhone(new PhoneNumber(110, "111-111-1111"));
            joe.setFax(new PhoneNumber(220, "222-221-2222"));
           
            String xml = xstream.toXML(joe);
            System.out.println("Cho ra dạng xml là:   \n"+ xml);
           
            Person newJoe = (Person)xstream.fromXML(xml);
            //Xem thuộc tính trong biến số newJoe thuộc lớp Person
            System.out.println("\nIn ra thông tin của biến newJoe với First Name, Last Name and Phone:\n ");
            System.out.println("First Name: " + newJoe.getFirstName());
            System.out.println("Last Name: " + newJoe.getLastName());
            System.out.println("Phone: " + newJoe.getPhone().getNumber());
      }
}
 
 
Giải Thích
 
1. import com.thoughtworks.xstream.XStream;
Dòng đầu tiên này cho biết ta cần sử dụng lớp có tên XStream được định nghĩa trong gói com.thughtworks.xstream.
 
2. Các tập tin PhoneNumber.java và Person.java được coi như là các Bean có tên là PhoneNumber và Person. Phần bean có tên PhoneNumber có hai thuộc tính: code và number, cùng với các hàm get và set của nó. Phần bean có tên là Person có 4 thuộc tính: firstName, lastName, phone và fax, cùng với các hàm get và set.
 
3. Tập tin TestXStream.java có chứa phương thức main() là chương trình dùng để kiểm tra các phương thức mà thư viện XStream đã phát triển.  Đối với bạn IT, thì tập tin này là phần cốt lõi để hiểu cách hoạt động của thư viện XStream.
 
a. Hàng đầu tiên: XStream xstream = new XStream(); 
Cú pháp này cho biết ta đặt biến sxtream thuộc lớp XStream và được khởi tạo.
 
b. Person joe = new Person("Joe", "Walnes");
Cú pháp này cho biết ta đặt biến joe theo lớp Person, và nó được khởi tạo với giá trị cho tên First Name là Joe và cho tên Last Name là Walnes.
 
c. Hai dòng:
            joe.setPhone(new PhoneNumber(110, "111-111-1111"));
            joe.setFax(new PhoneNumber(220, "222-221-2222"));
Cho biết giá trị điện thoại Phone và Fax của Joe được gán qua hai cặp giá trị 110, 111-111-1111 và 220, 222-221-2222 qua các phương thức set.
 
d. String xml = xstream.toXML(joe);
Cú pháp này cho ta biết rằng biến xml thuộc lớp String có nhận được giá trị trả về từ phương thức toXML() của biến sxtream thuộc lớp XStream. Giá trị trả về này sẽ cho ra dạng XML, tức là biến giá trị đối tượng của Java thành dạng XML. Như vậy giá trị của biến xml sẽ là:
 
Cho ra dạng xml là:  
<Person>
 <firstName>Joe</firstName>
 <lastName>Walnes</lastName>
 <phone>
    <code>110</code>
    <number>111-111-1111</number>
 </phone>
 <fax>
    <code>220</code>
    <number>222-221-2222</number>
 </fax>
</Person>
 
e. System.out.println("Cho ra dạng xml là:   \n"+ xml);
Dòng này sẽ hiển thị kết quả ra màn hình, và kết quả của nó được hiển thị như ở mục d. nêu ở trên.
 
f. Person newJoe = (Person)xstream.fromXML(xml);
Dòng này cho ta chuyển đổi dữ liệu đang nằm trong dạng (hay cấu trúc) XML qua dạng đối tượng của lớp Java.  Để thực hiện điều này, ta dùng phương thức fromXML() từ biến xstream của lớp XStream. Sau đó ta phải ép chuyển kiểu để thành lớp Person, và gán giá trị trả lại đã ép đó cho biến newJoe thuộc lớp Person.
  
 
Kết Quả
 
Khi ta cho chạy thử chương trình TestXStream.java, kết quả thu được là một dạng XML được tạo ra mà trong đó nó có cấu trúc chỉ sự liên hệ giữa Person và PhoneNumber như sau:
 
Cho ra dạng xml là:  
<Person>
 <firstName>Joe</firstName>
 <lastName>Walnes</lastName>
 <phone>
    <code>110</code>
    <number>111-111-1111</number>
 </phone>
 <fax>
    <code>220</code>
   <number>222-221-2222</number>
 </fax>
</Person>
 
In ra thông tin của biến newJoe với First Name, Last Name and Phone:
First Name: Joe
Last Name: Walnes
Phone: 111-111-1111
 
Chú ý: Bốn dòng đánh dấu mầu vàng sau cùng trong phần Kết Quả là hiển thị kết quả của dạng XML được "biến đổi" hay ép kiểu thành đối tượng Person của dạng Java.  Đây là tiến trình đưa dạng XML qua dạng đối tượng Java qua phương thức fromXML() của lớp XStream.
 

Tải mã nguồn của bài viết này dạng zip file.  Tập tin này có đính kèm 2 tập tin của thư viện XStream, đó là xstream-1.3.1.jar và xpp3_min-1.1.4c.jar.

Đường dẫn cho bài viết này:  http://viet.seriesmathstudy.com/xstream .
(Bài viết này dành cho các bạn đã biết Java)
 
Phương Tân Biên
(Ngày 22 Tháng 10 Năm 2009)