Python

Python Standard Library – ElementTree XML

Xin chào, trong bài viết này chúng ta sẽ tìm hiểu cách trích xuất dữ liệu từ file XML với thư viện ElementTree của Python.


TRÍCH XUẤT DỮ LIỆU TỪ FILE XML

Để trích xuất dữ liệu với thư viện ElementTree, chúng ta sử dụng 2 class Element ElementTree. Trong đó, class ElementTree sẽ biểu diễn toàn bộ file XML (thường dùng để đọc/ghi file XML), còn class Element sẽ biểu diễn từng điểm dữ liệu riêng biệt.

+ Import thư viện:

import xml.etree.ElementTree as ET

+ Load dữ liệu từ file XML: 

tree = ET.parse(filename)
root = tree.getroot()

+ Load dữ liệu từ XML String:

root = ET.fromstring(string)

Trong đó:

  • filename – tên của file XML cần load;
  • string – dữ liệu XML ở dạng String;
  • treeElementTree instance biểu diễn toàn bộ dữ liệu của file;
  • rootElement instance biểu diễn root element.

Một điểm dữ liệu (còn gọi là element) trong XML được biểu diễn như sau:

<tagname attribute_1=”value_1attribute_2=”value_2text hoặc sub-element </tagname>

+ Để trích xuất dữ liệu từ các element, chúng ta sử dụng các attribute và method sau:

  • element.tag – tên của element;
  • element.attrib – một Dict chứa các attributes của element;
  • element.text – String được chứa bên trong element;
  • element.find(tag) – trả về một Element instance chứa sub-element đầu tiên có tên thỏa mãn điều kiện;
  • element.findall(tag) – trả về một List chứa các Element instances chứa các sub-elements có tên thỏa mãn điều kiện;
  • element.get(key, default=None) – trả về giá trị của element’s attribute “key”.
  • element.iter(tag=None) – trả về một iterator chứa các sub-elements (và children của chúng) có tên thỏa mãn điều kiện.

Ngoài ra, chúng ta có thể sử dụng vòng lặp để tìm ra các sub-element của element hiện tại.


ÁP DỤNG

File dữ liệu: data.xml

<?xml version='1.0' encoding='ISO-8859-1'?>
<?xml-stylesheet type='text/xsl' href='image_metadata_stylesheet.xsl'?>
<dataset>
    <name>imglab dataset</name>
    <comment>Created by imglab tool.</comment>
    <images>
        <image file='cardataset/1000.jpg'>
            <box top='111' left='403' width='72' height='60' ignore='1'/>
            <box top='115' left='525' width='77' height='64'/>
            <box top='84' left='648' width='74' height='64'/>
            <box top='33' left='474' width='47' height='44' ignore='1'/>
            <box top='59' left='533' width='61' height='52' ignore='1'/>
            <box top='13' left='645' width='40' height='29' ignore='1'/>
            <box top='5' left='584' width='37' height='27' ignore='1'/>
        </image>
        <image file='cardataset/1050.jpg'>
            <box top='142' left='360' width='82' height='70'/>
            <box top='264' left='495' width='142' height='134'/>
            <box top='86' left='652' width='71' height='60' ignore='1'/>
            <box top='20' left='636' width='44' height='35' ignore='1'/>
            <box top='44' left='555' width='49' height='36' ignore='1'/>
            <box top='17' left='569' width='36' height='27' ignore='1'/>
            <box top='-6' left='542' width='42' height='27' ignore='1'/>
        </image>
    </images>
</dataset>

Đây là file XML mình nhận được sau khi sử dụng công cụ imglab để gắn nhãn cho các đối tượng trong các bức ảnh. Nhiệm vụ bây giờ là trích xuất tên các file ảnh đã được gán nhãn và các bounding box chứa từng đối tượng trong trong bức ảnh đó.

File: parser.py

import xml.etree.ElementTree as ET

root = ET.fromstring(open("data.xml").read())
print("root: {}".format(root.tag))

for item in root:
    print("{}: {}".format(item.tag, item.text))
    
for image in root.find("images"):
    print("\tImage: ", image.get("file"))
    for box in image.findall("box"):
        print("\t\tBox: ", box.get("left"), box.get("top"), box.get("width"), box.get("height"))
    print()

Output:


Reference:
[
1] xm.etree.ElementTree – The ElementTree XML API

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s