17 เมษายน 2558

Published เมษายน 17, 2558 by with 0 comment

Python XML

บทความนี้จะพาผู้อ่านไปเรียนรู้การเขียนโปรแกรม Python กับ XML กันครับ

โดยไลบรารีที่จะเรียกใช้ในบทความนี้คือ 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 ความคิดเห็น:

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

แสดงความคิดเห็นได้ครับ :)