23.Hướng dẫn phân tích cú pháp XML – Python

XML là gì?

XML là viết tắt của eXtensible Markup Language. Nó được thiết kế để lưu trữ và vận chuyển lượng dữ liệu từ nhỏ đến trung bình và được sử dụng rộng rãi trong việc chia sẻ thông tin có cấu trúc.

Python cho phép bạn phân tích cú pháp và sửa đổi tài liệu định dạng XML. Để phân tích các tệp có định dạng XML, bạn cần một tệp XML trọn vẹn trong bộ nhớ. Trong bài học này, chúng ta sẽ tìm hiểu cách sử dụng lớp XML minidom trong Python để nạp và phân tích tệp XML.

Trong bài này, chúng ta sẽ tìm hiểu về:

  • Cách phân tích cú pháp XML bằng minidom
  • Cách tạo node XML
  • Cách phân tích cú pháp XML bằng ElementTree

Cách phân tích cú pháp XML bằng minidom

Chúng ta tạo trước một tệp XML mẫu để phân tích.

Bước 1) Bên trong tệp, chúng ta có thể thấy thẻ tên(fname), họ(lname), quê quán(home) và chuyên môn (SQL, Python,Testing,  Business).

Bước 2) Khi chúng ta phân tích xong tài liệu, chúng ta sẽ in ra “tên node (node name)” gốc của tài liệu đó cùng với “tên thẻ con đầu tiên (firstchild tagname)”. Tên thẻ (tagname) và tên node (node name) là các thuộc tính chuẩn của tệp XML.

  • Nạp mô-đun xml.dom.minidom và khai báo tệp cần đọc (myxml.xml)
  • Tệp này có một số thông tin cơ bản của nhân viên như: tên, họ, quê quán, chuyên môn, v.v.
  • Chúng ta sử dụng hàm phân tích cú pháp của minidom XML để đọc và phân tích tệp XML
  • Chúng ta có biến doc để lưu kết quả trả về của hàm parse.
  • Chúng ta muốn in tên node và tên thẻ con từ tệp, vì vậy chúng ta cần đưa nó vào hàm print.
  • Chạy mã nguồn – Chương trình sẽ in ra tên node (#document) và tên thẻ con đầu tiên (employee) từ tệp XML.

Lưu ý:

Trong trường hợp bạn không quen thuộc với các loại quy ước đặt tên, nodeName (tên node) và child tagName (tên thẻ con) là tên hay thuộc tính chuẩn của một dom XML.

Bước 3) Chúng ta cũng có thể gọi danh sách các thẻ XML và in chúng ra. Ở đây chúng ta in ra một tập các kỹ năng như SQL, Python, Kiểm thử, Kinh tế.

  • Khai báo biến expertise, từ đó chúng ta có thể lấy ra tất cả các thông tin của một thẻ.
  • Sử dụng hàm chuẩn “getElementsByTagName” từ dom.
  • Hàm sẽ giúp lấy ra toàn bộ các kỹ năng được liệt kê trong tệp.
  • Khai báo vòng lặp để duyệt qua từng thẻ kỹ năng.
  • Chạy mã nguồn – Chương trình sẽ in ra danh sách 4 kỹ năng.

Cách tạo node XML

Chúng ta có thể tạo một thuộc tính mới bằng cách sử dụng hàm “createElement” rồi sau đó nối thuộc tính hay thẻ mới này vào các thẻ hiện có trong XML. Chúng ta sẽ thêm một thẻ “BigData” trong tệp XML của mình.

  1. Bạn cần lập trình để thêm một thuộc tính (BigData) vào thẻ XML hiện có.
  2. Sau đó bạn cần in ra thẻ XML với thuộc tính mới được bổ sung vào các thẻ XML hiện có.

  • Để thêm một thuộc tính XML mới vào tệp, chúng ta sử dụng “doc.create elements”
  • Đoạn mã này sẽ tạo một thẻ kỹ năng cho thuộc tính mới là “Big-data”
  • Thêm thẻ kỹ năng này vào trong thẻ con đầu tiên (employee).
  • Thực thi mã nguồn – thẻ mới “big data” sẽ xuất hiện cùng với danh sách các kỹ năng khác.

Ví dụ phân tích cú pháp XML

Ví dụ sử dụng Python 2

import xml.dom.minidom

def main():
# use the parse() function to load and parse an XML file
   doc = xml.dom.minidom.parse("Myxml.xml");
  
# print out the document node and the name of the first child tag
   print doc.nodeName
   print doc.firstChild.tagName
  
# get a list of XML tags from the document and print each one
   expertise = doc.getElementsByTagName("expertise")
   print "%d expertise:" % expertise.length
   for skill in expertise:
     print skill.getAttribute("name")
    
# create a new XML tag and add it into the document
   newexpertise = doc.createElement("expertise")
   newexpertise.setAttribute("name", "BigData")
   doc.firstChild.appendChild(newexpertise)
   print " "

   expertise = doc.getElementsByTagName("expertise")
   print "%d expertise:" % expertise.length
   for skill in expertise:
     print skill.getAttribute("name")
    
if name == "__main__":
  main()

Ví dụ sử dụng Python 3

import xml.dom.minidom

def main():
    # use the parse() function to load and parse an XML file
    doc = xml.dom.minidom.parse("Myxml.xml")

    # print out the document node and the name of the first child tag
    print (doc.nodeName)
    print (doc.firstChild.tagName)
    # get a list of XML tags from the document and print each one
    expertise = doc.getElementsByTagName("expertise")
    print ("%d expertise:" % expertise.length)
    for skill in expertise:
        print (skill.getAttribute("name"))

    # create a new XML tag and add it into the document
    newexpertise = doc.createElement("expertise")
    newexpertise.setAttribute("name", "BigData")
    doc.firstChild.appendChild(newexpertise)
    print (" ")

    expertise = doc.getElementsByTagName("expertise")
    print ("%d expertise:" % expertise.length)
    for skill in expertise:
        print (skill.getAttribute("name"))

if __name__ == "__main__":
    main()

Cách phân tích cú pháp XML bằng ElementTree

ElementTree là một API để thao tác với XML. ElementTree là cách dễ dàng để xử lý các tệp XML.

Chúng ta sử dụng tài liệu XML sau đây làm dữ liệu mẫu:

<data>
   <items>
      <item name="expertise1">SQL</item>
      <item name="expertise2">Python</item>
   </items>
</data>

Đọc XML bằng ElementTree:

Trước tiên chúng ta phải thêm mô-đun xml.etree.EuityTree.

import xml.etree.ElementTree as ET

Bây giờ chúng ta sẽ đọc ra phần tử gốc của tệp XML

root = tree.getroot()

Sau đây là mã nguồn hoàn chỉnh để đọc dữ liệu xml ở trên

import xml.etree.ElementTree as ET
tree = ET.parse('items.xml')
root = tree.getroot()

# all items data
print('Expertise Data:')

for elem in root:
   for subelem in elem:
      print(subelem.text)

Kết quả

Expertise Data:
SQL
Python

Tổng kết

Python cho phép bạn phân tích toàn bộ tài liệu XML cùng một lúc chứ không chỉ là từng dòng một. Để phân tích tài liệu XML, bạn cần có toàn bộ tài liệu trong bộ nhớ.

  • Để phân tích tài liệu XML
    • Nạp mô-đun xml.dom.minidom
    • Sử dụng hàm “parse” để phân tích tài liệu (doc = xml.dom.minidom.parse (file_name);
    • Gọi danh sách các thẻ XML từ tài liệu XML bằng đoạn mã sau (= doc.getElementsByTagName (“tên của thẻ xml”)
  • Để tạo và thêm thuộc tính mới trong tài liệu XML
    • Sử dụng hàm “createElement”

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *