StAX:Streaming API for XML
วันจันทร์ที่ 8 ธันวาคม 2008
Filed under Uncategorized
ป้ายกำกับ: java, StAX, Web Service, XML
วันนี้ผมจะสอนการใช้ StAX วันนี้จะสอนอ่าน xml ก่อนนะส่วนการเขียนไว้ภาคสองนะจ๊ะ (จริงๆก็สอนทำการบ้านนั่นแหละ)
หลังจากใช้ eclipse สร้าง dynamic web ขึ้นมา (ตามขั้นตอนของ Meawznoy ในขั้นตอนที่ 6) ก็ต้อง method รับค่าและ return ตามปกติ
ซึ่งการเก็บข้อมูลอาจารย์ก็ให้ใช้ XML ก็เลยจะสอนการใช้ StAX กัน ง่ายกว่า DOM เยอะเลย
ตัวอย่าง XML //สร้างโดย คลิกขวาที่โปรเจค new>file เลือกเป็น xml>> เลือกโฟลเดอร์เดียวกับ java code
<?xml version=”1.0″ encoding=”UTF-8″?>
<gas_list>
<gas type=”e20″>
<price>15.87</price>
</gas>
<gas type=”b5″>
<price>19.87</price>
</gas>
<gas type=”b5plus”>
<price>10.40</price>
</gas>
<gas type=”diesel”>
<price>12.40</price>
</gas>
</gas_list>
อธิบายคร่าวๆกับคนที่ยังไม่ค่อยรู้จัก XML
<?xml …> อันนี้ก็เป็นการบอกเฮดเดอร์ xml version,encoding ไม่มีไรมาก
แท๊ก <gas_list> </gas_list> เรียกว่า root element โดยมี <gas></gas> เป็น child element
<price></price> ก็เป็น child element ของ<gas></gas> เหมือนกัน
แล้วใน <gas></gas> จะมี type=”xxx” อยู่เจ้านี่เค้าเรียกว่า Attribute มันมีเท่ากับ
<gas>
<type>b5plus</type>
<price>10.40</price>
</gas>
แต่ทำไมผมเลือกใช้ แบบ Atribute หรอ ก็เพราะ element มีซ้ำกันได้แต่ Atribute เค้าห้ามซ้ำหน่ะสิ
มาเริ่มใช้ StAx กันเลย
String fileName = “db.xml”;
FileInputStream FileStream = new FileInputStream(fileName);//ขั้นแรกก็ต้องอ่านไฟล์มาก่อน
XMLStreamReader xmlStream = XMLInputFactory.newInstance().createXMLStreamReader(FileStream); //แล้วสร้าง XML streamreader ขึ้นมา
while(xmlStream.hasNext()) //วนลูปอ่านxml
{
………….
}
แล้วทีนี้การที่จะทำไรกับตัว XML ก็ต้องมี event กันหน่อย
event ต่างๆ
- XMLStreamConstants.START_ELEMENT
- XMLStreamConstants.END_ELEMENT
- XMLStreamConstants.PROCESSING_INSTRUCTION
- XMLStreamConstants.CHARACTERS
- XMLStreamConstants.COMMENT
- XMLStreamConstants.SPACE
- XMLStreamConstants.START_DOCUMENT
- XMLStreamConstants.END_DOCUMENT
- XMLStreamConstants.ENTITY_ REFERENCE
- XMLStreamConstants.ATTRIBUTE
- XMLStreamConstants.DTD
- XMLStreamConstants.CDATA
- XMLStreamConstants.NAMESPACE
- XMLStreamConstants.NOTATION_DECLARATION
- XMLStreamConstants.ENTITY_DECLARATION
ค่าทั้งหมดเป็น int ถ้าใครจำ event เป็นตัวเลขได้ก็แทนไปเลยครับ เรียง 1-15 (แต่เรียกจาก XMLStreamConstants คงง่ายกว่า)
ซึ่งในแต่ละ event ก็เรียก แต่ละ method ได้ไม่เหมือนกัน
| Event | Valid Methods |
|---|---|
| All states | getProperty(), hasNext(), require(), close(), getNamespaceURI(), isStartElement(), isEndElement(), isCharacters(), isWhiteSpace(), getNamespaceContext(), getEventType(),getLocation(), hasText(), hasName() |
START_ELEMENT |
next(), getName(), getLocalName(), hasName(), getPrefix(), getAttributeXXX(), isAttributeSpecified(), getNamespaceXXX(), getElementText(), nextTag() |
ATTRIBUTE |
next(), nextTag() getAttributeXXX(), isAttributeSpecified() |
NAMESPACE |
next(), nextTag() getNamespaceXXX() |
END_ELEMENT |
next(), getName(), getLocalName(), hasName(), getPrefix(), getNamespaceXXX(), nextTag() |
CHARACTERS |
next(), getTextXXX(), nextTag() |
CDATA |
next(), getTextXXX(), nextTag() |
COMMENT |
next(), getTextXXX(), nextTag() |
SPACE |
next(), getTextXXX(), nextTag() |
START_DOCUMENT |
next(), getEncoding(), getVersion(), isStandalone(), standaloneSet(), getCharacterEncodingScheme(), nextTag() |
END_DOCUMENT |
close() |
PROCESSING_INSTRUCTION |
next(), getPITarget(), getPIData(), nextTag() |
ENTITY_REFERENCE |
next(), getLocalName(), getText(), nextTag() |
DTD |
next(), getText(), nextTag() |
ตัวอย่างcode ที่พอจะเอามาทำการบ้านได้
int state;
while(xmlStream.hasNext())
{
state= xmlStream.next();if(state==XMLStreamConstants.START_ELEMENT && xmlStream.getLocalName()== “gas” )
{
result+= “|gas=”+xmlStream.getAttributeValue(0);
if(xmlStream.getAttributeValue(0).endsWith(argv))
{
//xmlStream.next();
result = argv+”tag=”+xmlStream.getLocalName();
xmlStream.next();
result+= “event”+xmlStream.getEventType();// end element gas
xmlStream.next();
result+= “local=”+xmlStream.getLocalName(); // start element price
result= xmlStream.getElementText();
break;
//result += xmlStream.getElementText();}
}
}
xmlStream.close();
แค่นี้ก็อ่านค่าจาก xml มาได้แล้ว คราวหน้าจะมาต่อการเขียนลงไฟล์กัน
ปล.1 จัดรูปแบบ code ยากจัง
ปล.2 code ผมดูโง่ๆไปหน่อยนะ น่าจะสั้นกว่านี้ได้
ปล.3 เอามาจาก blognone กับ อีกที่
ปล.3 ราตรีสวัสดิ์ครับ