วันศุกร์ที่ 30 กรกฎาคม พ.ศ. 2553

Example Use Java parse xml to Object : ตัวอย่างการ parse xml String ให้เป็น Object

ปัจจุบัน xml เป็นภาษาที่จำเป็น(ณ ตอนนี้)สำหรับการสื่อสารหรือแลกเปลี่ยนข้อมูลระหว่าองค์กร หรือระหว่าง โปรแกรมกับโปรแกรม ตัวอย่างใช่พวก web service เป็นต้น ปัญหาที่ตามคือการที่ต้อง convert ภาษา xml ให้อยุ่ในรูปของภาษานั้นๆ เช่น เป็น php ,c# หรือ java สำหรับตัวอย่างนี้คือการ parse ค่า xml String ให้เป็น Object โดยมีการใช้ xpath มาช่วยมีตัวอย่างดังนี้

1.xml String format
2.bean Object
3.การ parse โดยใช้ xpath ในการเข้าถึง tree node ใน xml

1.xml String format

<request>
<person>
<id>01</id>
<fname>jame</fname>
<lname>closeling</lname>
<email>jame@ai-prosoft.com</email>
<tel>+6684101312x</tel>
<salary>25000</salary>
</person>
</request>

****************************
2. สร้าง bean สำหรับเก็บ object attribute ของ person ดังนี้
package com.ai.zon;
/*TODO:
* author :pradoem 2010-07-31
* */
public class Person {

//attribute
private String id;
private String fname;
private String lname;
private String email;
private String tel;
private String salary;

//method access getting/setting
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getFname() {
return fname;
}
public void setFname(String fname) {
this.fname = fname;
}
public String getLname() {
return lname;
}
public void setLname(String lname) {
this.lname = lname;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getSalary() {
return salary;
}
public void setSalary(String salary) {
this.salary = salary;
}

//toString
@Override
public String toString() {
return "Person [email=" + email + ", fname=" + fname + ", id=" + id
+ ", lname=" + lname + ", salary=" + salary + ", tel=" + tel
+ "]";
}
}

************************************

3.การ parse โดยใช้ xpath ในการเข้าถึง tree node ใน xml
package com.ai.zon;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

public class TestXxm2Obj {

/**
* @author pradoem 2010-07-30
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//การเรียนใช้งาน

String xml = "01jamecloselingjame@ai-prosoft.com+6684101312x25000";
Person obj = xml2Obj(xml);

System.out.println("*************************");
System.out.println("Object to String values is :"+obj.toString());
}

//method get ค่าจาก tag xml โดย parse parameter doc,xpath,tag_name และ จะ return ค่า value กลับไป
private static String getNodeValuesXml(Document doc,XPath xpath, String preFix)
{
String ret="";
try
{
// คำสั่งชุดนี้สำหรับการใช้ xpath ในการเข้าถึง tag name value และ node name value
XPathExpression expr = xpath.compile(preFix);
Object result = expr.evaluate(doc, XPathConstants.NODESET);
NodeList textNameNodesList = (NodeList) result;


for (int i = 0; i < textnode =" textNameNodesList.item(i);" ret="textNode.getNodeValue();">>getNodeValuesXml:", ex.fillInStackTrace());
return ret;
}//try

}//method

//method convert xml 2 object
private static Person xml2Obj(String xml)
{
Person obj = null;

try
{
//ตรวจสอบ String xml ก่อนว่ามีค่าหรือป่าว
if((xml == null) || xml.equals(""))
return null;

//สร้าง instance Document
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();

//โดยค่าเริ่มต้นสำหรับ support Namespace เป็น false แต่เรา set เป็น true
// เพื่อให้สนับสนุน XML namespaces
domFactory.setNamespaceAware(true);

// ปรกาศ doc - builder
DocumentBuilder builder;

try
{
//สร้าง doc - builder มีการ ดักจับ try-catch เพื่อสร้างไม่สำเร็จ
builder = domFactory.newDocumentBuilder();
}
catch (ParserConfigurationException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
return obj;
}

//prepared String to byte array for sax
//ตรงไปตรงมาครับ อ่านข้อมูล xml String ให้เป็น byte array
ByteArrayInputStream bArrStream = new java.io.ByteArrayInputStream(xml.getBytes());

//InputSource เป็น object ของ sax สำหรับรับค่า input ที่เป้น byte array เพื่อเตรียมโหลดเข้า Doc sax
InputSource input = new InputSource(bArrStream);

//โหลด xml เข้าใน Doc
Document doc= builder.parse(input);

//ประกาศและสร้าง instance xpath
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();

//สร้าง object person
obj = new Person();

//คำสั่ง xpath สำหรับกาเข้าถึง value ใน tag xml /request/person/id/text()
// ใช้คำสั่ง //id/text() ถ้าแบบนี้ไม่ต้องรู้ว่า tag root ก่อนหน้าเป็นอะไร ให้ค้นหา tag id ทั้งหมด
obj.setId(getNodeValuesXml(doc,xpath,"//id/text()"));
obj.setFname(getNodeValuesXml(doc,xpath,"//fname/text()"));
obj.setLname(getNodeValuesXml(doc,xpath,"/request/person/lname/text()"));
obj.setEmail(getNodeValuesXml(doc,xpath,"/request/person/email/text()"));
obj.setTel(getNodeValuesXml(doc,xpath,"/request/person/tel/text()"));
obj.setSalary(getNodeValuesXml(doc,xpath,"/request/person/salary/text()"));

return obj;
}
catch (SAXException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
return obj;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return obj;
}
catch(Exception e)
{
System.out.println(e.fillInStackTrace());
return obj;
}
}
}

************************

//ผลลัพท์ของโปรแกรมที่เป็น object
****************************
Object to String values is :Person [email=jame@ai-prosoft.com, fname=jame, id=01, lname=closeling, salary=25000, tel=+6684101312x]

เราสามารถใช้คำสั่ง . ในการเอาไปใช้งานได้ดังนี้
System.out.println("ID :"+obj.getId());

อันนี้อาจเป็นตัวอย่างง่ายๆสำหรับการ parse xml ให้เป็น object ซึ่งจริงๆแล้วมีหลายวิธี และมี libraries สำหรับการ parse xml สำหรับ ภาษา java เยอะแยะมากมาย
นี่เป็น demo case study สำหรับ การ parse xml เพื่อไปใช้งานจริง

ไม่มีความคิดเห็น:

แสดงความคิดเห็น