โดยไลบรารีที่จะเรียกใช้ในบทความนี้คือ xml.etree.ElementTree ครับ
XML คืออะไร
ย่อมาจาก XML: Extensible Markup Language เป็นภาษาหนึ่งบนคอมพิวเตอร์ที่เน้นส่วนที่เป็นข้อมูล เป็นภาษามาร์กอัปขยายได้ นิยมใช้ในการแลกเปลี่ยนข้อมูลผ่านอินเทอร์เน็ต และเป็นมาตรฐานของ W3C
โครงสร้าง XML
โครงสร้าง XML ประกอบไปด้วย ส่วนหัว xml , ชื่อแท็ก (Element) และชื่อแอตทิบิวต์ (Attribute)
ส่วนหัว
เป็นการระบุว่าเป็นเอกสาร XML โดยขึ้นอยู่กับมาร์กอัปที่จะใช้ เช่น
[xml]<?xml version="1.0"?> [/xml]
ชื่อแท็ก (Element)
ประกอบไปด้วย แท็กเปิดและปิด
ตัวอย่างเช่น
[xml]
<data></data>
[/xml]
ชื่อแอตทิบิวต์ (Attribute)
ประกอบไปด้วย แท็กเปิดและปิดเหมือนกันแต่มีรายละเอียดขึ้นมา โดยจะบอกแอตทิบิวต์ของชื่อแท็กนั้น ๆ
ตัวอย่างเช่น
[xml]
<home name="Ton" />
[/xml]
หรือ
[xml]
<home name="Ton">home</home>
[/xml]
ตัวอย่างไฟล์ XML
[xml]
<?xml version="1.0"?>
<data updated="yes">
<home>
<home name="Ton">1</home>
<home name="Tan">2</home>
</home>
</data>
[/xml]
สร้างไฟล์ XML บนภาษา Python
ใช้ไลบรารี xml.etree.ElementTree ในการเขียนไฟล์ xml โดยมีคำสั่งที่ควรรู้ต่อไปนี้ครับ
- Element() เป็นคำสั่งสำหรับประกาศ Element
- SubElement(Element, SubElement , Attribute) เป็นคำสั่งสำหรับเพิ่ม Element ย่อยหรือเพิ่ม Attribute ให้กับ Element ย่อย
- text เพิ่มข้อมูลเข้าไปยัง Attribute
- set(name, Attribute) ปรับแต่ง Attribute และเพิ่ม Attribute ให้กับ Element
โค้ดการทำงาน
[python]
from xml.etree import ElementTree
from xml.etree.ElementTree import Element
from xml.etree.ElementTree import SubElement
# <data/>
data = Element('data') # ประกาศ Element
data.set('updated', 'yes') #ปรับแต่ง Attribute และเพิ่ม Attribute ให้กับ Element
# <data><home/>
home = SubElement(data, 'home') #เพิ่ม Element ย่อย
# <data><home><home/>
ton = SubElement(home, 'home', name='Ton') #เพิ่ม Attribute ให้กับ Element
ton.text = '1' # เพิ่มข้อมูลเข้าไปยัง Attribute
tan = SubElement(home, 'home', name='Tan') #เพิ่ม Attribute ให้กับ Element
tan.text = '2' # เพิ่มข้อมูลเข้าไปยัง Attribute
output_file = open('data.xml', 'w') #สร้างไฟล์ data.xml
output_file.write('<?xml version="1.0"?>') #เพิ่มส่วนหัว xml
output_file.write(ElementTree.tostring(data).decode('utf-8')) #เขียนไฟล์ xml จากข้อมูลที่กำหนด โดยข้อมูลที่ได้จะเป็น bytes ต้องแปลงให้เป็น str ด้วย decode
output_file.close()
[/python]
ผลลัพธ์
[xml]<?xml version="1.0"?><data updated="yes"><home><home name="Ton">1</home><home name="Tan">2</home></home></data>[/xml]
Parse XML Python
หลังจากสร้างไฟล์ XML กันไปแล้ว คราวนี้เราจะไป Parse XML ด้วย Python กันครับ โดยใช้ไลบรารี xml.etree.ElementTree ในการ Parse XM โดยมีคำสั่งที่ใช้งานบ่อย ๆ ดังนี้
- parse(source) ดึงไฟล์ source เข้ามาเพื่อทำการ parse
- getroot() คืนค่า root element
- tag ดึง Element ออกมา
- attrib ดึง Attribute ออกมา
- text แสดงข้อมูลที่อยู่ใน Element
- find() , findall() ค้นหาข้อมูล
ไฟล์ data.xml
[xml]
<?xml version="1.0"?>
<data updated="yes">
<home>
<home name="Ton">1</home>
<home name="Tan">2</home>
</home>
</data>
[/xml]
ไฟล์ Python
[python]
import xml.etree.ElementTree as ET
tree = ET.parse('data.xml') #ดึงไฟล์ data.xml เข้ามา
root = tree.getroot()
home = root.find('home')
print(root.tag)
print(root.attrib)
print(root[0][0].text)
print(root[0][1].text)
for home in root.findall( 'home/home' ):
print(home.attrib['name'])
[/python]
ผลลัพธ์
data
{'updated': 'yes'}
1
2
Ton
Tan
โมดูล lxml
โมดูล lxml ป็นโมดูลใน Python โมดูลหนึ่งสำหรับงานประมวลผล XML ไม่ว่าจะเป็นการสร้าง XML หรือ Parse XML สามารถเขียนคำสั่งการทำงานได้ง่ายกว่าใช้ไลบรารีของ Python ครับ
- รวม libxml2/libxslt กับ ElementTree API มาในตัว ทำให้สนับสนุนทั้ง XPath, RelaxNG, XML Schema, XSLT, C14N และอื่น ๆ อีกมากมาย
- ใช้ BSD license
- สนับสนุนทั้ง Python 2 , Python 3
โหลดโมดูล lxml ได้ที่ pypi.python.org/pypi/lxml/ หรือใช้ pip โดยใช้คำสั่ง
pip install lxml
สำหรับผู้ใช้ Windows สามารถโหลดไฟล์ whl มาติดตั้งได้จาก http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml ครับ
ตัอย่างการใช้งาน
ไฟล์ data.xml
[xml]
<?xml version="1.0"?>
<data updated="yes">
<home>
<home name="Ton">1</home>
<home name="Tan">2</home>
</home>
</data>
[/xml]
ไฟล์ Python ทำการ Parse XML โดยใช้ lxml
[python]
from lxml import etree
tree = etree.parse('data.xml') #ไฟล์ data.xml
for data in tree.xpath('//home'):
print(data.attrib)
for sf in data.getchildren():
print(sf.text)
[/python]
อ่านเอกสารการใช้งาน lxml ได้ที่ lxml.de
ติดตามบทความต่อไปนะครับ
ขอบคุณครับ
0 ความคิดเห็น:
แสดงความคิดเห็น
แสดงความคิดเห็นได้ครับ :)