คราวที่แล้วเราพูดถึงความเป็นมาของ JAXB กันมาแล้ว คราวนี้เราจะมาลองทำกันบ้าง ซึ่งเราจะสอนตั้งแต่การสร้างไฟล์ xsd จนกระทั่งสร้างเอกสาร XML ออกมาเลย แต่บางคนสงสัยว่าทำไมต้องเป็นไฟล์ xsd แล้วทำไมไม่สร้างไฟล์ DTD เราจึงอยากพูดข้อดีที่ใช้ไฟล์ xsd แล้วไปทดลองทำกันเลย
เหตุผลที่ผู้พัฒนาระบบส่วนมากใช้ XML Schemas มากกว่า DTDs
ในการกำหนดโครงสร้างเอกสาร XML ก็คือ
1. XML Schemas สามารถทำการต่อยอดในอนาคตได้ เช่น สามารถใช้คุณสมบัติ reuse ได้
1 โดยที่มันสามารถนำ Schemas กลับไปใช้ใหม่ได้ (reuse) ใน Schemas อื่น ๆ
2 สามารถสร้างชนิดข้อมูลเป็นของเราเองได้จากชนิดมาตรฐาน
3 สามารถอ้างอิงได้หลาย Schemas ในเอกสาร XML เดียวกัน
2. XML Schemas มีความสมบูรณ์และประสิทธิภาพมากกว่า DTDs
3. XML Schemas เขียนโดยรูปแบบ XML
1 เนื่องจากไม่จำเป็นต้องศึกษาโครงสร้างภาษาใหม่ เพราะใช้โครงสร้างของภาษา XML
2 สามารถใช้ XML editor เพื่อสร้างหรือแก้ไขไฟล์ XML Schema ได้ โดยไม่ต้องหา editor ใหม่
3 สามารถใช้ XML parser ในการแปลภาษา Schema files
4 สามารถจัดการกับ Schemas โดยใช้ XML DOM ได้
5 สามารถแปลงจาก Schemas ของเราไปเป็น XSLT ได้
4. XML Schemas สนับสนุนชนิดข้อมูลต่าง ๆ ช่วยให้
1 ง่ายต่อการกำหนดชนิดข้อมูลที่ใช้ในแต่ละ elements หรือ attributes นั้น ๆ ซึ่งถ้าชนิดข้อมูลผิด XML Schemas ก็จะไม่ยอมเนื่องจากผิดโครงสร้างที่มันกำหนดไว้
2 ง่ายต่อการ validate การระบุค่าในเอกสาร XML
3 ง่ายต่อการทำงานกับข้อมูลที่มาจากฐานข้อมูล
4 ง่ายต่อการกำหนดรูปแบบข้อมูล (data formats)
5 ง่ายต่อการ convert ข้อมูลในกรณีที่มีชนิดข้อมูลที่ต่างกัน
5. XML Schemas สนับสนุน namespaces
6. XML Schemas ช่วยให้การติดต่อสื่อสารข้อมูลมีความปลอดภัย เมื่อการส่งข้อมูลจากผู้ส่งไปยังผู้รับ ข้อมูลที่ส่งระหว่างกันนั้นจะต้องทำการตกลงระหว่างกันเพื่อไม่ให้การสื่อสารเกิดความผิดพลาด
ตัวอย่างการใช้งาน JAXB
ก่อนอื่นเราจะต้องสร้างไฟล์ xsd ก่อนซึ่งเราจะต้องรู้ถึงโครงสร้างในการเขียนกันเสียก่อน โดยจะมีรายละเอียดคร่าวดังนี้
<?xml version="1.0" encoding = "UTF-8" ?> //ประกาศเวอร์ชั่นของเอกสาร XML และการเข้ารหัสตัวอักษร
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> // ประกาศเนมสเปส คือ ประการที่อยู่ของ syntax ที่เราจะใช้อ้าง โดยเราสามารถสร้างเองได้ และอ้างอิงไปยังที่อยู่ที่เราเก็บ
<xs:element name="ชื่อ element"> // ประกาศชื่อไฟล์
<xs:complexType> // ประกาศว่าภายใน xml element จะมี attribute หรือ element อีก
<xs:sequence> // ประกาศลำดับขั้นตอน
>>>> เนื้อหาที่เราต้องการประกาศ <<<<
</xs:sequence>
</xs:complexType>
</xs:element>
ซึ่งการสร้างไฟล์ xsd ก็ยังมีหลายแบบ ดังนี้
แบบแยกส่วน จะเป็นเหมือนแบบทั่วไป แต่จะประกาศ element ไว้ก่อน แล้วเมื่อจะใช้ถึงจะทำการอ้างชื่อ element นั้นๆ ซึ่งจะช่วยให้ง่ายต่อการแก้ไข และเมื่อใช้ element เดิมๆ ตัวอย่าง http://pastebin.com/1S45EjF0
แบบnamed types จะเป็นการกำหนด class หรือ type ขึ้นมาเอง ซึ่งเราสามารถนำกลับมาใช้ใหม่ได้
เมื่อเราได้ไฟล์ xsd แล้ว ต่อมาเราก็มาลองทำโปรแกรมเพื่อจะออกเอกสาร XML และแปลงเอกสาร XML กลับมาเป็นข้อมูลกันเลย
ขั้นแรก สร้างโปรเจค
เปิดโปรแกรม netbean ขึ้นมาแล้วสร้างโปรเจคใหม่ขึ้นมา -> เลือก Java Application แล้วกด next
ต่อมาก็เลือก ก็ตั้งชื่อโปรเจค แล้วกด Finish
ขั้นที่สอง นำไฟล์ xsd เข้าในโปรเจค
สร้างไฟล์ใหม่ เลือก XML -> JAXB Binding แล้วกด next
ต่อมาตั้งชื่อ ไฟล์ที่เรานำเข้ามา แล้เลือกที่อยู่ของไฟล์ แล้วกด Finish
ถ้าไฟล์ของเราสร้างถูกต้อง ไม่มีข้อผิดพลาด Java จะทำการสร้างไฟล์ .java ให้เราอัตโนมัติ
ขั้นที่สาม สร้างเอกสาร XML (Marshalled)
ไปที่ main โปรแกรม แล้วสร้าง แล้วสร้าง object โดยจะเป็นการสร้างผ่าน ObjectFactory ต่อมาก็ทำการพิมพ์ jaxbm แล้วกด tab เป็นการสร้าง marshal ที่ netbean ได้เตรียมไว้ให้แล้ว
เมื่อลองรัน แล้วเราจะได้โค๊ด XML ดังนี้
เนื่องด้วยเรายังไม่ได้กำหนดข้อมูลที่จะสร้างดังนั้นเราจะต้องกำหนดข้อมูลเสียก่อน โดยเราจะต้องทำการ set ข้อมูลทั้งหมด ผ่าน method set ที่ java ได้สร้างไว้ให้เราแล้ว เมื่อเราทำการ set ค่าเรียบร้อยแล้ว เราจะได้ข้อมูลเอกสาร XML ดังนี้ ตัวอย่าง http://pastebin.com/eAQdmFU6
และถ้าหากเราจะสร้างเป็นไฟล์ XML ก็เพียงเปลี่ยนคำสั่ง marshaller.marshal(h1, System.out); ให้เป็นคำสั่งดังนี้
marshaller.marshal(h1, new FileOutputStream("ที่อยู่ที่จะเก็บ/ชื่อไฟล์.xml"));
ขั้นที่สี่ แปลงไฟล์ XML เป็นข้อมูล (Unmarshalled)
ไปที่ main โปรแกรม แล้วสร้าง แล้วสร้าง object โดยจะเป็นการสร้างผ่าน ObjectFactory ต่อมาก็ทำการพิมพ์ jaxbu แล้วกด tab เป็นการสร้าง marshal ที่ netbean ได้เตรียมไว้ให้แล้ว
เมื่อลองรัน แล้วจะได้ผลดังนี้
ถ้าหากต้องการรู้ข้อมูลที่ไปเรียกจากไฟล์ XML ก็ให้ทำการพิมพ์ออกมาทางหน้าจอ โดยใช้ method get ที่ java ได้สร้างไว้ให้เราแล้ว เมื่อลองใส่คำสั่งให้แสดงออกทางหน้าจอแล้วจะได้ผลลัพธ์ดังนี้ ตัวอย่าง http://pastebin.com/Qjx12eTG
ลองนำไปทำดูนะครับ คิดว่ามันไม่น่าจะอยากเกินไปนะครับ ^^