Làm cách nào để đọc XML bằng Python?

XML, hoặc Ngôn ngữ đánh dấu mở rộng, là ngôn ngữ đánh dấu thường được sử dụng để cấu trúc, lưu trữ và truyền dữ liệu giữa các hệ thống. Mặc dù không phổ biến như trước đây nhưng nó vẫn được sử dụng trong các dịch vụ như RSS và SOAP, cũng như để cấu trúc các tệp như tài liệu Microsoft Office

Với việc Python là ngôn ngữ phổ biến cho web và phân tích dữ liệu, có khả năng bạn sẽ cần đọc hoặc ghi dữ liệu XML vào một lúc nào đó, trong trường hợp đó thì bạn thật may mắn.

Trong suốt bài viết này, chúng ta sẽ chủ yếu xem xét mô-đun ElementTree để đọc, viết và sửa đổi dữ liệu XML. Chúng tôi cũng sẽ so sánh nó với mô-đun minidom cũ hơn trong một vài phần đầu tiên để bạn có thể so sánh tốt giữa hai mô-đun này.

Các mô-đun XML

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
3, hay Triển khai DOM tối thiểu, là một triển khai đơn giản của Mô hình đối tượng tài liệu (DOM). DOM là một giao diện lập trình ứng dụng xử lý XML như một cấu trúc cây, trong đó mỗi nút trong cây là một đối tượng. Do đó, việc sử dụng mô-đun này yêu cầu chúng ta phải làm quen với chức năng của nó

Mô-đun

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
4 cung cấp giao diện "Pythonic" hơn để xử lý XMl và là một tùy chọn tốt cho những người không quen thuộc với DOM. Nó cũng có khả năng là một ứng cử viên tốt hơn để được sử dụng bởi nhiều lập trình viên mới làm quen hơn do giao diện đơn giản của nó, mà bạn sẽ thấy trong suốt bài viết này

Trong bài viết này, mô-đun

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
4 sẽ được sử dụng trong tất cả các ví dụ, trong khi mô-đun
xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
3 cũng sẽ được trình bày, nhưng chỉ để đếm và đọc các tài liệu XML

Ví dụ về tệp XML

Trong các ví dụ dưới đây, chúng tôi sẽ sử dụng tệp XML sau, tệp này sẽ được lưu dưới dạng "items. xml"


    
        item1abc
        item2abc
    

Như bạn có thể thấy, đó là một ví dụ XML khá đơn giản, chỉ chứa một vài đối tượng lồng nhau và một thuộc tính. Tuy nhiên, nó đủ để chứng minh tất cả các thao tác XML trong bài viết này

Đọc tài liệu XML

Sử dụng minidom

Để phân tích một tài liệu XML bằng cách sử dụng

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
3, trước tiên chúng ta phải nhập nó từ mô-đun
xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
8. Mô-đun này sử dụng hàm
xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
9 để tạo đối tượng DOM từ tệp XML của chúng tôi. Hàm
xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
9 có cú pháp như sau

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])

Ở đây tên tệp có thể là một chuỗi chứa đường dẫn tệp hoặc một đối tượng kiểu tệp. Hàm trả về một tài liệu, có thể được xử lý dưới dạng một loại XML. Do đó, chúng ta có thể sử dụng hàm

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
01 để tìm một thẻ cụ thể

Vì mỗi nút có thể được coi là một đối tượng, nên chúng ta có thể truy cập các thuộc tính và văn bản của một phần tử bằng cách sử dụng các thuộc tính của đối tượng. Trong ví dụ dưới đây, chúng tôi đã truy cập các thuộc tính và văn bản của một nút cụ thể và của tất cả các nút cùng nhau

Kết quả là như sau

Hình 1

Nếu chúng tôi muốn sử dụng một tệp đã được mở, chỉ cần chuyển đối tượng tệp của chúng tôi tới

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
9 như vậy

Ngoài ra, nếu dữ liệu XML đã được tải dưới dạng chuỗi thì chúng ta có thể sử dụng hàm

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
03 để thay thế

Sử dụng ElementTree

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
4 trình bày cho chúng ta một cách rất đơn giản để xử lý các tệp XML. Như mọi khi, để sử dụng nó, trước tiên chúng ta phải nhập mô-đun. Trong mã của chúng tôi, chúng tôi sử dụng lệnh
xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
05 với từ khóa
xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
06, cho phép chúng tôi sử dụng tên đơn giản (trong trường hợp này là ___107) cho mô-đun trong mã

Sau khi nhập, chúng tôi tạo cấu trúc cây với hàm

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
9 và chúng tôi lấy phần tử gốc của nó. Khi chúng ta có quyền truy cập vào nút gốc, chúng ta có thể dễ dàng duyệt qua cây, bởi vì cây là một đồ thị được kết nối

Sử dụng

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
4 và giống như ví dụ mã trước đó, chúng tôi có được các thuộc tính nút và văn bản bằng cách sử dụng các đối tượng liên quan đến từng nút

Mã này như sau

Kết quả sẽ như sau

Hình 2

Như bạn có thể thấy, điều này rất giống với ví dụ về

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
3. Một trong những điểm khác biệt chính là đối tượng
xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
01 chỉ đơn giản là một đối tượng từ điển, điều này làm cho nó tương thích hơn một chút với mã Python khác. Chúng tôi cũng không cần sử dụng
xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
02 để truy cập giá trị thuộc tính của mặt hàng như chúng tôi đã làm trước đây

Bạn có thể nhận thấy cách truy cập các đối tượng và thuộc tính bằng

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
4 giống Pythonic hơn một chút, như chúng tôi đã đề cập trước đây. Điều này là do dữ liệu XML được phân tích cú pháp dưới dạng danh sách và từ điển đơn giản, không giống như với
xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
3 trong đó các mục được phân tích cú pháp dưới dạng tùy chỉnh
xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
05 và "Nút văn bản DOM"

Đếm các phần tử của tài liệu XML

Sử dụng minidom

Như trong trường hợp trước,

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
3 phải được nhập từ mô-đun
xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
07. Mô-đun này cung cấp chức năng
xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
08 mà chúng tôi sẽ sử dụng để tìm mục thẻ. Sau khi có được, chúng tôi sử dụng phương thức tích hợp sẵn
xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
09 để lấy số lượng mục con được kết nối với một nút. Kết quả thu được từ mã bên dưới được hiển thị trong Hình 3

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
0

Hình 3

Hãy nhớ rằng điều này sẽ chỉ đếm số mục con bên dưới ghi chú mà bạn thực hiện

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
09 trên đó, trong trường hợp này là nút gốc. Nếu bạn muốn tìm tất cả các phần tử con trong một cây lớn hơn nhiều, bạn cần duyệt qua tất cả các phần tử và đếm từng phần tử con của chúng

Sử dụng ElementTree

Tương tự, mô-đun

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
4 cho phép chúng tôi tính toán số lượng nút được kết nối với một nút

mã ví dụ

Kết quả là như sau

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
0

hinh 4

Viết tài liệu XML

Sử dụng ElementTree

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
4 cũng tuyệt vời để ghi dữ liệu vào các tệp XML. Đoạn mã dưới đây cho biết cách tạo một tệp XML có cùng cấu trúc với tệp mà chúng tôi đã sử dụng trong các ví dụ trước

các bước là

  1. Tạo một phần tử, phần tử này sẽ đóng vai trò là phần tử gốc của chúng ta. Trong trường hợp của chúng tôi, thẻ cho phần tử này là "dữ liệu"
  2. Khi chúng ta có phần tử gốc, chúng ta có thể tạo các phần tử con bằng cách sử dụng hàm
    xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
    
    43. Hàm này có cú pháp

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
44

Ở đây

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
45 là nút cha để kết nối,
xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
01 là một từ điển chứa các thuộc tính phần tử và
xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
47 là các đối số từ khóa bổ sung. Hàm này trả về một phần tử cho chúng ta, phần tử này có thể được sử dụng để đính kèm các phần tử phụ khác, như chúng ta làm trong các dòng sau bằng cách chuyển các phần tử tới hàm tạo
xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
43.
3. Mặc dù chúng ta có thể thêm các thuộc tính của mình bằng hàm
xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
43, nhưng chúng ta cũng có thể sử dụng hàm

    
        item1abc
        item2abc
    

10, như cách chúng ta thực hiện trong đoạn mã sau. Văn bản phần tử được tạo bằng thuộc tính

    
        item1abc
        item2abc
    

11 của đối tượng

    
        item1abc
        item2abc
    

12.
4. Trong 3 dòng mã cuối cùng bên dưới, chúng tôi tạo một chuỗi từ cây XML và ghi dữ liệu đó vào một tệp mà chúng tôi mở.

mã ví dụ

Thực thi mã này sẽ dẫn đến một tệp mới, "items2. xml", tương đương với "item" ban đầu. xml", ít nhất là về cấu trúc dữ liệu XML. Tuy nhiên, bạn có thể sẽ nhận thấy rằng chuỗi kết quả chỉ có một dòng và không có dấu thụt đầu dòng

Tìm phần tử XML

Sử dụng ElementTree

Mô-đun

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
4 cung cấp chức năng

    
        item1abc
        item2abc
    

14, giúp chúng tôi tìm các mục cụ thể trong cây. Nó trả về tất cả các mục với điều kiện được chỉ định. Ngoài ra, mô-đun có chức năng

    
        item1abc
        item2abc
    

15, chỉ trả về phần tử con đầu tiên phù hợp với tiêu chí đã chỉ định. Cú pháp của cả hai hàm này như sau

Hãy xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, tiêu chuẩn được ngành chấp nhận và bao gồm bảng gian lận. Dừng các lệnh Git trên Google và thực sự tìm hiểu nó

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
4

    
        item1abc
        item2abc
    

1

Đối với cả hai hàm này, tham số


    
        item1abc
        item2abc
    

16 có thể là tên thẻ XML hoặc đường dẫn. Hàm

    
        item1abc
        item2abc
    

14 trả về một danh sách các phần tử và

    
        item1abc
        item2abc
    

18 trả về một đối tượng duy nhất thuộc loại

    
        item1abc
        item2abc
    

12

Ngoài ra, có một hàm trợ giúp khác trả về văn bản của nút đầu tiên khớp với tiêu chí đã cho

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
3

Dưới đây là một số mã ví dụ để cho bạn thấy chính xác cách các chức năng này hoạt động

Và đây là kết quả của việc chạy mã này

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
4

Hình 5

Sửa đổi các phần tử XML

Sử dụng ElementTree

Mô-đun

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
4 trình bày một số công cụ để sửa đổi các tài liệu XML hiện có. Ví dụ dưới đây cho thấy cách thay đổi tên của nút, thay đổi tên của thuộc tính và sửa đổi giá trị của nó cũng như cách thêm thuộc tính phụ vào phần tử

Văn bản nút có thể được thay đổi bằng cách chỉ định giá trị mới trong trường văn bản của đối tượng nút. Tên của thuộc tính có thể được xác định lại bằng cách sử dụng hàm

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
31. Hàm
xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
32 không chỉ hoạt động trên một thuộc tính hiện có, nó cũng có thể được sử dụng để xác định một thuộc tính mới

Đoạn mã dưới đây cho thấy cách thực hiện các thao tác này

Sau khi chạy mã, tệp XML kết quả "newitems. xml" sẽ có một cây XML với dữ liệu sau

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
8

Như chúng ta có thể thấy khi so sánh với tệp XML gốc, tên của các thành phần mục đã thay đổi thành "newitem", văn bản thành "văn bản mới" và thuộc tính "name2" đã được thêm vào cả hai nút

Bạn cũng có thể nhận thấy rằng việc ghi dữ liệu XML theo cách này (gọi

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
33 bằng tên tệp) sẽ thêm một số định dạng khác vào cây XML để nó chứa các dòng mới và thụt đầu dòng

Tạo các phần tử con XML

Sử dụng ElementTree

Mô-đun

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
4 có nhiều cách để thêm phần tử mới. Cách đầu tiên chúng ta sẽ xem xét là sử dụng hàm
xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
35, hàm này có tên nút và từ điển với các thuộc tính của nó làm tham số

Cách thứ hai là thông qua lớp

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
36, lớp này lấy phần tử cha và từ điển các thuộc tính làm đầu vào

Trong ví dụ của chúng tôi dưới đây, chúng tôi hiển thị cả hai phương pháp. Trong trường hợp đầu tiên, nút không có thuộc tính, vì vậy chúng tôi đã tạo một từ điển trống (

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
37). Trong trường hợp thứ hai, chúng tôi sử dụng một từ điển phổ biến để tạo các thuộc tính

Sau khi chạy mã này, tệp XML kết quả sẽ trông như thế này

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
4

Như chúng ta có thể thấy khi so sánh với tệp gốc, phần tử "seconditems" và phần tử phụ "seconditem" của nó đã được thêm vào. Ngoài ra, nút "seconditem" có thuộc tính "name2" và văn bản của nó là "seconditemabc", như mong đợi

Xóa các phần tử XML

Sử dụng ElementTree

Như bạn có thể mong đợi, mô-đun

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
4 có chức năng cần thiết để xóa các thuộc tính và phần tử phụ của nút

Xóa một thuộc tính

Đoạn mã dưới đây cho biết cách xóa thuộc tính của nút bằng cách sử dụng hàm

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
39. Hàm áp dụng cho tham số đối tượng
xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
01. Nó chỉ định tên của thuộc tính và đặt nó thành
xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
41

Kết quả sẽ là tệp XML sau


    
        item1abc
        item2abc
    

Như chúng ta có thể thấy trong đoạn mã XML ở trên, mục đầu tiên không có thuộc tính "tên"

Xóa một phần tử phụ

Có thể xóa một phần tử phụ cụ thể bằng hàm

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
42. Chức năng này phải chỉ định nút mà chúng tôi muốn xóa

Ví dụ sau đây cho chúng ta thấy cách sử dụng nó

Kết quả sẽ là tệp XML sau

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
1

Như chúng ta có thể thấy từ mã XML ở trên, hiện tại chỉ có một nút "mục". Cái thứ hai đã bị loại bỏ khỏi cây ban đầu

Xóa tất cả các phần tử phụ

Mô-đun

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
4 trình bày cho chúng ta chức năng
xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
44, có thể được sử dụng để loại bỏ tất cả các phần tử con của một phần tử đã cho

Ví dụ dưới đây cho chúng ta thấy cách sử dụng

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
44

Kết quả sẽ là tệp XML sau

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
2

Như chúng ta có thể thấy trong đoạn mã XML ở trên, tất cả các phần tử con của phần tử "items" đã bị xóa khỏi cây

kết thúc

Python cung cấp một số tùy chọn để xử lý các tệp XML. Trong bài viết này, chúng tôi đã xem xét mô-đun

xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
4 và sử dụng nó để phân tích cú pháp, tạo, sửa đổi và xóa các tệp XML. Chúng tôi cũng đã sử dụng mô hình
xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
3 để phân tích các tệp XML. Cá nhân tôi khuyên bạn nên sử dụng mô-đun
xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])
4 vì nó dễ làm việc hơn nhiều và là mô-đun hiện đại hơn trong số hai mô-đun

Làm cách nào để đọc chuỗi XML trong Python?

Đầu tiên là bằng cách sử dụng hàm parse() và thứ hai là hàm fromstring() . Hàm parse() phân tích cú pháp tài liệu XML được cung cấp dưới dạng tệp trong khi đó, fromstring phân tích cú pháp XML khi được cung cấp dưới dạng chuỗi i. e trong ba dấu ngoặc kép.

Làm cách nào để truy cập các phần tử XML trong Python?

Để phân tích cú pháp tài liệu XML, bạn cần có toàn bộ tài liệu trong bộ nhớ. .
Để phân tích cú pháp tài liệu XML
Nhập xml. nhà thờ. thiểu số
Sử dụng hàm “parse” để phân tích tài liệu ( doc=xml. nhà thờ. thiểu số. phân tích cú pháp (tên tệp);
Gọi danh sách các thẻ XML từ tài liệu XML bằng mã (=doc. getElementsByTagName(“tên của thẻ xml”)

Làm cách nào để trích xuất dữ liệu XML trong Python?

Cách thức hoạt động của điều này là chúng tôi. .
Tải tài liệu XML của chúng ta vào bộ nhớ và xây dựng một đối tượng XML ElementTree
Sau đó, chúng tôi sử dụng phương thức find, chuyển vào bộ chọn XPath, cho phép chúng tôi chỉ định phần tử nào chúng tôi đang cố trích xuất
Nếu không tìm thấy phần tử, trả về Không có

Làm cách nào để đọc XML trong gấu trúc Python?

Đọc XML dưới dạng pandas dataframe . Theo mặc định, pandas-read-xml sẽ coi thẻ gốc là "hàng" của khung dữ liệu gấu trúc. Nếu điều này không đúng, hãy chuyển đối số root_is_rows=False. identify the path to the "root" tag in the XML from which you want to extract the data. By default, pandas-read-xml will treat the root tag as being the "rows" of the pandas dataframe. If this is not true, pass the argument root_is_rows=False .