Hướng dẫn python xml to dataframe - python xml vào khung dữ liệu

XML là ngôn ngữ đánh dấu được sử dụng để biểu diễn và phân phối các cấu trúc dữ liệu có thể thường khó tạo bằng cách sử dụng các định dạng bảng tiêu chuẩn hơn.

Về cơ bản, định dạng XML tương tự như HTML (thực sự là ngôn ngữ đánh dấu khác), trong đó dữ liệu được tổ chức theo các phần tử, xác định loại thông tin được phơi sáng và mỗi phần tử chứa giá trị thực tế ở dạng nội dung hoặc thuộc tính.

Ảnh của Florian Olivo trên unplash

Trang XML trên Wikipedia cung cấp một cái nhìn tổng quan sâu rộng về tất cả các chi tiết và kỹ thuật của định dạng này, nhưng các khái niệm chính rất đơn giản. Mỗi phần thông tin được phân định bởi một thẻ cụ thể, như thế này:




A
16



B
17



C
16



A
17

Trong ví dụ này, mỗi học sinh được đại diện bởi một yếu tố , có thuộc tính name chứa tên của một học sinh cụ thể. Mỗi phần tử này sau đó có các phần tử phụ được xác định bởi các thẻ ,

import xml.etree.ElementTree as et 

xtree = et.parse("students.xml")
xroot = xtree.getroot()

0; Giữa các thẻ này, nội dung dữ liệu thực tế đề cập đến sinh viên đã cho có mặt. Hãy nói rằng dữ liệu này được lưu trong một tệp XML có tên là Sinh viên.xml.

Chúng ta có thể nghĩ về cấu trúc này như một khung dữ liệu gấu trúc trong đó mỗi học sinh đại diện cho một quan sát, với thuộc tính name của nó là định danh chính và các yếu tố phụ là các tính năng khác của quan sát. Một biểu diễn bảng của các dữ liệu này sẽ như thế này:

Vì vậy, chúng tôi muốn tìm cách chuyển đổi dữ liệu có cấu trúc XML thành một bảng chức năng hơn.

Với cấu trúc của các tệp XML, chúng ta có thể đại diện cho chúng như một cây và đây là cách tiếp cận được sử dụng bởi mô -đun XML.ETREE.elementTrepython. Việc phân tích cú pháp của tệp sinh viên của chúng tôi.xml, bắt đầu từ gốc của cây, cụ thể là phần tử

import xml.etree.ElementTree as et 

xtree = et.parse("students.xml")
xroot = xtree.getroot()

2, chứa toàn bộ cấu trúc dữ liệu.Python module. The parsing of our “students.xml” file starts at the root of the tree, namely the
import xml.etree.ElementTree as et 

xtree = et.parse("students.xml")
xroot = xtree.getroot()

2 element, which contains the entire data structure.

import xml.etree.ElementTree as et 

xtree = et.parse("students.xml")
xroot = xtree.getroot()

Bây giờ chúng tôi có thể lặp qua từng nút của cây, điều đó có nghĩa là chúng tôi sẽ nhận được từng yếu tố sinh viên và lấy thuộc tính ____ của nó và tất cả các yếu tố phụ của nó để xây dựng DataFrame của chúng tôi.

for node in xroot: 
s_name = node.attrib.get("name")
s_mail = node.find("email").text
s_grade = node.find("grade").text
s_age = node.find("age").text

Để có được thuộc tính name, chúng tôi sử dụng hàm

import xml.etree.ElementTree as et 

xtree = et.parse("students.xml")
xroot = xtree.getroot()

5, trong khi nội dung văn bản của từng phần tử có thể được truy xuất bằng cách sử dụng hàm
import xml.etree.ElementTree as et 

xtree = et.parse("students.xml")
xroot = xtree.getroot()

6 của các nút. ; Chúng tôi có thể xây dựng quy trình này như sau:
Each iteration will return a set of data that can be thought as an observation in a pandas DataFrame; we can build this procedure as follows:

import pandas as pd 
import xml.etree.ElementTree as et

xtree = et.parse("students.xml")
xroot = xtree.getroot()

df_cols = ["name", "email", "grade", "age"]
rows = []

for node in xroot:
s_name = node.attrib.get("name")
s_mail = node.find("email").text if node is not None else None
s_grade = node.find("grade").text if node is not None else None
s_age = node.find("age").text if node is not None else None

rows.append({"name": s_name, "email": s_mail,
"grade": s_grade, "age": s_age})

out_df = pd.DataFrame(rows, columns = df_cols)

Nhược điểm của phương pháp này là bạn cần biết cấu trúc của tệp XML trước và bạn phải có tên cột mã cứng phù hợp. Chúng tôi có thể cố gắng chuyển đổi mã này thành một chức năng hữu ích và linh hoạt hơn mà không cần phải khó -Code bất kỳ giá trị nào:
We can try to convert this code to a more useful and versatile function, without having to hard-code any values:

import pandas as pd
import xml.etree.ElementTree as et

def parse_XML(xml_file, df_cols):
"""Parse the input XML file and store the result in a pandas
DataFrame with the given columns.

The first element of df_cols is supposed to be the identifier
variable, which is an attribute of each node element in the
XML data; other features will be parsed from the text content
of each sub-element.
"""

xtree = et.parse(xml_file)
xroot = xtree.getroot()
rows = []

for node in xroot:
res = []
res.append(node.attrib.get(df_cols[0]))
for el in df_cols[1:]:
if node is not None and node.find(el) is not None:
res.append(node.find(el).text)
else:
res.append(None)
rows.append({df_cols[i]: res[i]
for i, _ in enumerate(df_cols)})

out_df = pd.DataFrame(rows, columns=df_cols)

return out_df

Một đoạn mã thú vị là sự hiểu biết của Dict trong:

{df_cols[i]: res[i] for i, _ in enumerate(df_cols)}

trong đó một từ điển trong tên cột tên: Giá trị nút được tạo và thêm vào danh sách các hàng. Chúng cuối cùng sẽ được sử dụng để tạo ra hoàn chỉnh DataFrame.

Nếu chúng tôi áp dụng chức năng của mình cho tệp của Student Student.xml bằng cách sử dụng

import xml.etree.ElementTree as et 

xtree = et.parse("students.xml")
xroot = xtree.getroot()

7, kết quả chính xác là bảng chúng tôi đã thấy ở trên.

Đây là một triển khai hiệu quả hơn của chức năng phân tích cú pháp XML, mặc dù chúng ta vẫn cần biết cấu trúc cơ bản của tài liệu XML đầu vào mà chúng ta muốn phân tích.