Posts Tagged ‘ XML

[Java] อ่านข้อมูลจาก XML โดยใช้ JDOM Parser

การอ่านข้อมูลจาก xml โดยใช้ Java นั้นมีหลายรูปแบบมากเนื่องจาก Java เองมี XML Parser อยู่หลายตัว สำหรับตัวอย่างนี้จะใช้ JDOM Parser ซึ่งเร็วกว่าตัวอื่น เนื่องจากไม่ไ่ด้ใช้ในการแก้ไขข้อมูล xml แต่เป็นการอ่านข้อมูลจาก xml เพียงอย่้างเดียว
1. โหลด jdom-x.x.jar จากนั้นก็ add เข้าไปในโปรเจค
2. ข้อมูลที่จะรับมาจาก ผู้ใช้งานโดยการ post เข้ามายัง Sevlet ที่เตรียมไว้จะมีลักษณะดังนี้

<Payments>
	<customer id='1'>
		<item>1001</item>
		<price>1000.00</price>
	</customer>
	<customer id='2'>
		<item>1002</item>
		<price>20.00</price>
	</customer>
</Payments>

3. เขียน code ดังนี้
Read more

Insert XML to Oracle XMLType

มีงานที่ต้องนำข้อมูลที่อยู่ในรูปแบบ XML ลงไปบันทึกในฐานข้อมูล ของ Oracle ข้อมูลที่จะทำการบันทึก็เป็นแค่ XML ที่อยู่ในรูปแบบของ String ธรรมดาแต่ต้องการเอาไปเก็บเป็นชนิดข้อมูล (Data Type) ที่เป็น XML ของ Oracle จากการหาข้อมูลดูก็ได้ตัวอย่าง Code จาก เว็บ Oracle เลยทดลองเขียนเป็น PL/SQL ดังนี้
สร้างตาราง

CREATE TABLE XML_TEM(
  XML_ID    VARCHAR2(30 BYTE) NOT NULL,
  XML_DESC  VARCHAR2(50 BYTE),
  XML_DATA  SYS.XMLTYPE
);

สร้าง Procedure

CREATE OR REPLACE PROCEDURE INSERT_XML IS
    V_XML       VARCHAR(4000);
    V_ERR_CODE  VARCHAR(100);
    V_ERR_DESC  VARCHAR(1000);

BEGIN
    V_XML := V_XML||'<?xml version="1.0" encoding="UTF-8"?>';
    V_XML := V_XML||'<PROCESS>';
    V_XML := V_XML||'<STATUS>OK</STATUS>';
    V_XML := V_XML||'<DESC>Process transaction success.</DESC>';
    V_XML := V_XML||'</PROCESS>';
   
    INSERT INTO XML_TEM (XML_ID, XML_DESC, XML_DATA) 
    VALUES ('101','Command state',XMLTYPE(V_XML));
   
EXCEPTION
    WHEN OTHERS THEN
        V_ERR_CODE := SQLCODE;
        V_ERR_DESC := SQLERRM;        
END INSERT_XML;
/

ซึ่งไม่มีปัญหาอะไร และ ทดสอบโดยใช้วิธีเดียวกันนี้กับ Code Java ก็ใช้งานได้ดี ดังนี้

private static void insertXML() throws SQLException{
	Connection conn = null;
	PreparedStatement pStmt = null;
	StringBuffer sql = new StringBuffer();
	String xmlData = "<data><no>100</no><name>Name is</name></data>";
	try{
		conn = getConnection();							
		sql.append("INSERT INTO XML_TEM (XML_ID, XML_DESC, XML_DATA)");
		sql.append(" VALUES (?,?,XMLTYPE(?))");
				
		pStmt = conn.prepareStatement(sql.toString());
		pStmt.setString(1, "101");
		pStmt.setString(2, "XML Information support data");
		pStmt.setString(3, xmlData);
		
		pStmt.executeUpdate();
		conn.commit();		
	}catch (SQLException e){
		conn.rollback();
		e.printStackTrace();
	}finally{
		if(pStmt != null) pStmt.close();
		if(conn != null) conn.close();
	}
}

หมายเหตุ : สามารถใช้ได้กับ XML ขนาดสูงสุดที่ 64K เท่านั้น หากมีขนาดมากว่า 64k จะไม่สามารถใช้ได้
อ้างอิง
Loading a large XML Document into the Database

การใช้ CDATA ใน XML

การใช้งาน tag CDATA ในเอกสาร XML นั้นเพื่อใ้ห้สามารถใช้ tag หรือ อักขระสงวน เช่น สมการ, > , < ถ้าไม่ใส่ tag [xml] <![CDATA[ ข้อมูลที่มี อักขระสงวน เช่น สมการ, > , < ]]> [/xml] จะทำให้ XML parser อ่านเอกสารนั้นไม่ได้ ตัวอย่างเช่น การ configuration คำสั่ง SQL ไว้ในเอกสาร XML [xml] <SQL_QUERY> SELECT * FROM TB WHERE AGE > 10 AND AGE < 10 </SQL_QUERY> [/xml] คำสั่งนี้ถ้าใส่ใน tag XML โดยที่ไม่ใส่ CDATA จะทำให้เกิดปัญหาในการอ่านข้อมูลมาใช้งาน ต้องแก้ไขดังนี้ [xml] <SQL_QUERY> <![CDATA[ SELECT * FROM TB WHERE AGE > 10 AND AGE < 10 ]]> </SQL_QUERY> [/xml] นอกจากการใช้งานในเอกสาร XML แล้วสามารถนำไปใช้ใน JavaScript ในการณีที่ต้องการพิมพ์ อักขระสงวน ด้วย อ้างอิง
CDATA sections in XML

Tutorial : การใช้งาน XStream

Tutorial วันนี้ สืบเนื่องจากพี่ที่ทำงานให้ศึกษา การทำงานของระบบเก่าที่มีการส่งข้อมูลผ่าน HTTP แบบที่เค้าเรียกกันว่า XML Over HTTP ซึ่งผมเองก็ไม่ได้มีความรู้ด้วยซ้ำไปว่ามันคือ อะไร แต่มี Code ส่วนหนึ่งที่ผมต้องไปแก้ไข คือการรับค่าจากทางเครื่อง Server (ซึ่งส่งมาในรูปแบบโครงสร้างของ XML) แล้วมาทำการแกะ Code ในส่วนของ XML นี่ออกมาเป็นข้อมูลเพื่อทำการบันทึกลงฐานข้อมูล หรือ นำไปใช้ประโยชน์ต่อ ซึ่งผมเห็น Code ที่เขียนแล้ว รูปแบบจะเป็นอ่าน XML มาแล้วมาใช้ jdom อ่านมาทีละ element เพื่อ Set ค่าลงไปที่ DTO หรือ Domain ก่อนที่จะส่งไปบันทึก เลยคิดว่าน่าจะมีอะไรจะ Convert โครงสร้างของ XML มาเป็น Domain และ Domain ไปเป็น XML ได้เลยตามแบบ

Domain –> XML
XML –> Domain

จากความต้องการนี้ผมก็พยายามหาจาก อ. Google ก็ได้เจอกับเจ้านี่ XStream ซึ่งในเว็บ บอกว่าว่า XStream : “XStream is a simple library to serialize objects to XML and back again” ซึ่งตรงใจผมมาก (แต่ไม่รู้จะใช้ได้จริงมั้ย) หลังจากดาวโหลดมาแล้วก็ทดลองครับ โดยสร้าง Bean หรือ Domain ขึ้นมาตัวหนึ่งดังนี้

/**
 * File Name : Employee.java
 * Created Date : Dec 3, 2009 : 10:27:23 AM
 * Copyright © 2009 www.fun4station.com
 */
package com.fun4station.model;

/**
 * @Author Supot Saelao
 * @Version 1.0
 */
public class Employee {
	private int code;
	private String firstName;
	private String lastName;
	private double salary;

	public Employee() {	}

	public Employee(int code, String firstName, String lastName, double salary) {
		this.code = code;
		this.firstName = firstName;
		this.lastName = lastName;
		this.salary = salary;
	}

	//Generate get & set method
}

Read more