Cách thêm thuộc tính vào tệp xml bằng python?

Minh họa việc thêm một thuộc tính name=value vào một phần tử XML

Ví dụ này sử dụng tệp mẫu XML tại đây. mẫu1. xml. mẫu1. tệp xml chứa nội dung này

Cách thêm thuộc tính vào tệp xml bằng python?

import sys
import chilkat2

xml = chilkat2.Xml()

success = xml.LoadXmlFile("qa_data/xml/sample1.xml")
if (success != True):
    print(xml.LastErrorText)
    sys.exit()

# Navigate to the "books" element:
bFound = xml.FindChild2("books")
if (bFound == False):
    print("No books child found!")
    sys.exit()

numChildren = xml.NumChildren

i = 0
while i < numChildren :

    # Navigate to the Nth book 
    xml.GetChild2(i)

    # Display the book title:
    print(xml.GetAttrValue("title"))

    # Add a new integer attribute:
    # Should never fail..
    xml.AddAttributeInt("bookId",i)

    # Add a new unread="yes" attribute:
    xml.AddAttribute("unread","yes")

    # Navigate back up to the parent:
    xml.GetParent2()

    i = i + 1

# Navigate back to the document root:
xml.GetRoot2()

# Save the updated document:
success = xml.SaveXml("modified.xml")
if (success != True):
    print(xml.LastErrorText)
    sys.exit()

print(xml.GetXml())

Tìm hiểu cách bạn có thể phân tích cú pháp, khám phá, sửa đổi và điền các tệp XML bằng gói Python ElementTree, cho các vòng lặp và biểu thức XPath. Là một nhà khoa học dữ liệu, bạn sẽ thấy rằng việc hiểu XML là rất hữu ích cho cả việc quét web và thực tiễn chung trong việc phân tích cú pháp một tài liệu có cấu trúc

Extensible Markup Language (XML) là ngôn ngữ đánh dấu mã hóa tài liệu bằng cách xác định một bộ quy tắc ở cả định dạng máy đọc được và con người đọc được. Được mở rộng từ SGML (Ngôn ngữ đánh dấu tổng quát hóa tiêu chuẩn), nó cho phép chúng tôi mô tả cấu trúc của tài liệu. Trong XML, chúng ta có thể định nghĩa các thẻ tùy chỉnh. Chúng ta cũng có thể sử dụng XML làm định dạng chuẩn để trao đổi thông tin

  • Tài liệu XML có các phần, được gọi là phần tử, được xác định bởi thẻ bắt đầu và thẻ kết thúc. Thẻ là một cấu trúc đánh dấu bắt đầu bằng
    tree = ET.parse('movies.xml')
    root = tree.getroot()
    3 và kết thúc bằng
    tree = ET.parse('movies.xml')
    root = tree.getroot()
    4. Các ký tự giữa thẻ bắt đầu và thẻ kết thúc, nếu có, là nội dung của phần tử. Các phần tử có thể chứa đánh dấu, bao gồm các phần tử khác, được gọi là "phần tử con"
  • Phần tử cấp cao nhất, lớn nhất được gọi là gốc, chứa tất cả các phần tử khác
  • Thuộc tính là cặp giá trị tên tồn tại trong thẻ bắt đầu hoặc thẻ phần tử trống. Một thuộc tính XML chỉ có thể có một giá trị duy nhất và mỗi thuộc tính có thể xuất hiện nhiều nhất một lần trên mỗi phần tử

Đây là ảnh chụp nhanh của

tree = ET.parse('movies.xml')
root = tree.getroot()
5 mà chúng tôi sẽ sử dụng cho hướng dẫn này

<?xml version="1.0"?>
<collection>
<genre category="Action">
<decade years="1980s">
<movie favorite="True" title="Indiana Jones: The raiders of the lost Ark">
<format multiple="No">DVD</format>
<year>1981</year>
<rating>PG</rating>
<description>
'Archaeologist and adventurer Indiana Jones
is hired by the U.S. government to find the Ark of the Covenant before the Nazis.'
</description>
</movie>
<movie favorite="True" title="THE KARATE KID">
<format multiple="Yes">DVD,Online</format>
<year>1984</year>
<rating>PG</rating>
<description>None provided.</description>
</movie>
<movie favorite="False" title="Back 2 the Future">
<format multiple="False">Blu-ray</format>
<year>1985</year>
<rating>PG</rating>
<description>Marty McFly</description>
</movie>
</decade>
<decade years="1990s">
<movie favorite="False" title="X-Men">
<format multiple="Yes">dvd, digital</format>
<year>2000</year>
<rating>PG-13</rating>
<description>Two mutants come to a private academy for their kind whose resident superhero team must oppose a terrorist organization with similar powers.</description>
</movie>
<movie favorite="True" title="Batman Returns">
<format multiple="No">VHS</format>
<year>1992</year>
<rating>PG13</rating>
<description>NA.</description>
</movie>
<movie favorite="False" title="Reservoir Dogs">
<format multiple="No">Online</format>
<year>1992</year>
<rating>R</rating>
<description>WhAtEvER I Want!!!?!</description>
</movie>
</decade>
</genre>

<genre category="Thriller">
<decade years="1970s">
<movie favorite="False" title="ALIEN">
<format multiple="Yes">DVD</format>
<year>1979</year>
<rating>R</rating>
<description>"""""""""</description>
</movie>
</decade>
<decade years="1980s">
<movie favorite="True" title="Ferris Bueller's Day Off">
<format multiple="No">DVD</format>
<year>1986</year>
<rating>PG13</rating>
<description>Funny movie on funny guy </description>
</movie>
<movie favorite="FALSE" title="American Psycho">
<format multiple="No">blue-ray</format>
<year>2000</year>
<rating>Unrated</rating>
<description>psychopathic Bateman</description>
</movie>
</decade>
</genre>
Giới thiệu về ElementTree

Cấu trúc cây XML làm cho việc điều hướng, sửa đổi và loại bỏ tương đối đơn giản về mặt lập trình. Python có một thư viện tích hợp, ElementTree, có chức năng đọc và thao tác XML (và các tệp có cấu trúc tương tự khác)

Đầu tiên, nhập

tree = ET.parse('movies.xml')
root = tree.getroot()
6. Đó là một thông lệ phổ biến để sử dụng bí danh của
tree = ET.parse('movies.xml')
root = tree.getroot()
7

import xml.etree.ElementTree as ET

Phân tích dữ liệu XML

Trong tệp XML được cung cấp, có một bộ sưu tập phim cơ bản được mô tả. Vấn đề duy nhất là dữ liệu là một mớ hỗn độn. Đã có rất nhiều người quản lý khác nhau của bộ sưu tập này và mọi người đều có cách nhập dữ liệu vào tệp của riêng mình. Mục tiêu chính trong hướng dẫn này là đọc và hiểu tệp bằng Python — sau đó khắc phục sự cố

Trước tiên, bạn cần đọc trong tệp có

tree = ET.parse('movies.xml')
root = tree.getroot()
6

tree = ET.parse('movies.xml')
root = tree.getroot()

Bây giờ bạn đã khởi tạo cây, bạn nên xem XML và in ra các giá trị để hiểu cây được cấu trúc như thế nào

root.tag'collection'

Ở cấp cao nhất, bạn thấy rằng XML này bắt nguồn từ thẻ

tree = ET.parse('movies.xml')
root = tree.getroot()
9

root.attrib{}

Đối với vòng lặp

Bạn có thể dễ dàng lặp lại các phần tử con (thường được gọi là "con") trong thư mục gốc bằng cách sử dụng vòng lặp "for" đơn giản

for child in root:
print(child.tag, child.attrib)
genre {'category': 'Action'}
genre {'category': 'Thriller'}
genre {'category': 'Comedy'}

Bây giờ bạn biết rằng con cái của gốc

tree = ET.parse('movies.xml')
root = tree.getroot()
9 đều là
root.tag'collection'
1. Để chỉ định thể loại, XML sử dụng thuộc tính
root.tag'collection'
2. Có các phim Hành động, Kinh dị và Hài theo yếu tố
root.tag'collection'
1

Thông thường sẽ rất hữu ích khi biết tất cả các phần tử trong toàn bộ cây. Một chức năng hữu ích để làm điều đó là

root.tag'collection'
4

[elem.tag for elem in root.iter()]['collection',
'genre',
'decade',
'movie',
'format',
'year',
'rating',
'description',
'movie',
.
.
.
.
'movie',
'format',
'year',
'rating',
'description']

Có một cách hữu ích để xem toàn bộ tài liệu. Nếu bạn chuyển gốc vào phương thức

root.tag'collection'
5, bạn có thể trả lại toàn bộ tài liệu. Trong ElementTree, phương thức này có dạng hơi lạ

Vì ElementTree là một thư viện mạnh mẽ có thể diễn giải nhiều hơn chỉ XML, nên bạn phải chỉ định cả mã hóa và giải mã tài liệu mà bạn đang hiển thị dưới dạng chuỗi

Bạn có thể mở rộng việc sử dụng hàm

root.tag'collection'
6 để giúp tìm các yếu tố quan tâm cụ thể.
root.tag'collection'
4 sẽ liệt kê tất cả các phần tử con bên dưới gốc khớp với phần tử được chỉ định. Tại đây, bạn sẽ liệt kê tất cả các thuộc tính của phần tử
root.tag'collection'
8 trong cây

for movie in root.iter('movie'):
print(movie.attrib)
{'favorite': 'True', 'title': 'Indiana Jones: The raiders of the lost Ark'}
{'favorite': 'True', 'title': 'THE KARATE KID'}
{'favorite': 'False', 'title': 'Back 2 the Future'}
{'favorite': 'False', 'title': 'X-Men'}
{'favorite': 'True', 'title': 'Batman Returns'}
{'favorite': 'False', 'title': 'Reservoir Dogs'}
{'favorite': 'False', 'title': 'ALIEN'}
{'favorite': 'True', 'title': "Ferris Bueller's Day Off"}
{'favorite': 'FALSE', 'title': 'American Psycho'}
{'favorite': 'False', 'title': 'Batman: The Movie'}
{'favorite': 'True', 'title': 'Easy A'}
{'favorite': 'True', 'title': 'Dinner for SCHMUCKS'}
{'favorite': 'False', 'title': 'Ghostbusters'}
{'favorite': 'True', 'title': 'Robin Hood: Prince of Thieves'}

Biểu thức XPath

Nhiều khi các phần tử sẽ không có thuộc tính, chúng sẽ chỉ có nội dung văn bản. Sử dụng thuộc tính

root.tag'collection'
9, bạn có thể in ra nội dung này

Bây giờ, in ra tất cả các mô tả của phim

for description in root.iter('description'):
print(description.text)
'Archaeologist and adventurer Indiana Jones is hired by the U.S. government to find the Ark of the Covenant before the Nazis.'None provided.
Marty McFly
Two mutants come to a private academy for their kind whose resident superhero team must oppose a terrorist organization with similar powers.
NA.
WhAtEvER I Want!!!?!
"""""""""
Funny movie about a funny guy
psychopathic Bateman
What a joke!
Emma Stone = Hester Prynne
Tim (Rudd) is a rising executive who “succeeds” in finding the perfect guest, IRS employee Barry (Carell), for his boss’ monthly event, a so-called “dinner for idiots,” which offers certain
advantages to the exec who shows up with the biggest buffoon.
Who ya gonna call?
Robin Hood slaying

In ra XML rất hữu ích, nhưng XPath là ngôn ngữ truy vấn được sử dụng để tìm kiếm thông qua XML một cách nhanh chóng và dễ dàng. Tuy nhiên, việc hiểu XPath là cực kỳ quan trọng để quét và điền XML.

tree = ET.parse('movies.xml')
root = tree.getroot()
6 có hàm
root.attrib{}
1 sẽ duyệt qua các phần tử con trực tiếp của phần tử được tham chiếu

Tại đây, bạn sẽ tìm kiếm trên cây những bộ phim ra mắt năm 1992

for movie in root.findall("./genre/decade/movie/[year='1992']"):
print(movie.attrib)
{'favorite': 'True', 'title': 'Batman Returns'}
{'favorite': 'False', 'title': 'Reservoir Dogs'}

Hàm

root.attrib{}
1 luôn bắt đầu tại phần tử được chỉ định. Loại chức năng này cực kỳ mạnh mẽ để "tìm và thay thế". Bạn thậm chí có thể tìm kiếm trên các thuộc tính

Bây giờ, chỉ in ra những phim có sẵn ở nhiều định dạng (một thuộc tính)

import xml.etree.ElementTree as ET
0

Suy nghĩ xem tại sao, trong trường hợp này, câu lệnh in trả về giá trị “Có” của

root.attrib{}
3. Hãy suy nghĩ về cách xác định vòng lặp "for"

Mẹo. sử dụng

root.attrib{}
4 bên trong XPath để trả về phần tử cha của phần tử hiện tại

import xml.etree.ElementTree as ET
1

Sửa đổi một XML

Trước đó, tiêu đề phim là một mớ hỗn độn tuyệt đối. Bây giờ, in chúng ra một lần nữa

for movie in root.iter('movie'):
print(movie.attrib)
{'favorite': 'True', 'title': 'Indiana Jones: The raiders of the lost Ark'}
{'favorite': 'True', 'title': 'THE KARATE KID'}
{'favorite': 'False', 'title': 'Back 2 the Future'}
{'favorite': 'False', 'title': 'X-Men'}
{'favorite': 'True', 'title': 'Batman Returns'}
{'favorite': 'False', 'title': 'Reservoir Dogs'}
{'favorite': 'False', 'title': 'ALIEN'}
{'favorite': 'True', 'title': "Ferris Bueller's Day Off"}
{'favorite': 'FALSE', 'title': 'American Psycho'}
{'favorite': 'False', 'title': 'Batman: The Movie'}
{'favorite': 'True', 'title': 'Easy A'}
{'favorite': 'True', 'title': 'Dinner for SCHMUCKS'}
{'favorite': 'False', 'title': 'Ghostbusters'}
{'favorite': 'True', 'title': 'Robin Hood: Prince of Thieves'}

Sửa lỗi '2' trong Back 2 the Future. Đó phải là một vấn đề tìm và thay thế. Viết mã để tìm tiêu đề ‘Back 2 the Future’ và lưu nó dưới dạng một biến

import xml.etree.ElementTree as ET
3

Lưu ý rằng việc sử dụng phương thức

root.attrib{}
5 trả về một phần tử của cây. Phần lớn thời gian, sẽ hữu ích hơn khi chỉnh sửa nội dung trong một phần tử

Sửa đổi thuộc tính

root.attrib{}
6 của biến phần tử Back 2 the Future thành "Back to the Future". Sau đó, in ra các thuộc tính của biến của bạn để xem sự thay đổi của bạn. Bạn có thể dễ dàng làm điều này bằng cách truy cập vào thuộc tính của một phần tử và sau đó gán một giá trị mới cho nó

import xml.etree.ElementTree as ET
4

Ghi lại các thay đổi của bạn vào XML để chúng được cố định vĩnh viễn trong tài liệu. In lại các thuộc tính phim của bạn để đảm bảo các thay đổi của bạn hoạt động. Sử dụng phương pháp

root.attrib{}
7 để làm điều này

import xml.etree.ElementTree as ET
5

Sửa thuộc tính

Thuộc tính

root.attrib{}
3 không chính xác ở một số chỗ. Sử dụng
tree = ET.parse('movies.xml')
root = tree.getroot()
6 để sửa bộ chỉ định dựa trên số lượng định dạng của phim. Đầu tiên, in thuộc tính và văn bản
for child in root:
print(child.tag, child.attrib)
genre {'category': 'Action'}
genre {'category': 'Thriller'}
genre {'category': 'Comedy'}
0 để xem phần nào cần sửa

import xml.etree.ElementTree as ET
6

Có một số công việc cần phải được thực hiện trên thẻ này

Bạn có thể sử dụng biểu thức chính quy để tìm dấu phẩy — điều này sẽ cho biết thuộc tính

root.attrib{}
3 nên là "Có" hay "Không". Việc thêm và sửa đổi các thuộc tính có thể được thực hiện dễ dàng bằng phương pháp
for child in root:
print(child.tag, child.attrib)
genre {'category': 'Action'}
genre {'category': 'Thriller'}
genre {'category': 'Comedy'}
2

import xml.etree.ElementTree as ET
7

yếu tố di chuyển

Một số dữ liệu đã được đặt sai thập kỷ. Sử dụng những gì bạn đã học về XML và

tree = ET.parse('movies.xml')
root = tree.getroot()
6 để tìm và sửa các lỗi dữ liệu trong thập kỷ

Sẽ rất hữu ích nếu bạn in ra cả thẻ

for child in root:
print(child.tag, child.attrib)
genre {'category': 'Action'}
genre {'category': 'Thriller'}
genre {'category': 'Comedy'}
4 và thẻ
for child in root:
print(child.tag, child.attrib)
genre {'category': 'Action'}
genre {'category': 'Thriller'}
genre {'category': 'Comedy'}
5 trong toàn bộ tài liệu

import xml.etree.ElementTree as ET
8

Hai năm nhầm thập kỷ là những bộ phim từ những năm 2000. Chỉ ra những bộ phim đó là gì, sử dụng biểu thức XPath

import xml.etree.ElementTree as ET
9

Bạn phải thêm thẻ thập kỷ mới, thập niên 2000, vào thể loại Hành động để di chuyển dữ liệu X-Men. Phương pháp

for child in root:
print(child.tag, child.attrib)
genre {'category': 'Action'}
genre {'category': 'Thriller'}
genre {'category': 'Comedy'}
6 có thể được sử dụng để thêm thẻ này vào cuối XML

tree = ET.parse('movies.xml')
root = tree.getroot()
0

Bây giờ nối phim X-Men vào những năm 2000 và loại bỏ nó khỏi những năm 1990, lần lượt sử dụng

for child in root:
print(child.tag, child.attrib)
genre {'category': 'Action'}
genre {'category': 'Thriller'}
genre {'category': 'Comedy'}
7 và
for child in root:
print(child.tag, child.attrib)
genre {'category': 'Action'}
genre {'category': 'Thriller'}
genre {'category': 'Comedy'}
8

tree = ET.parse('movies.xml')
root = tree.getroot()
1

Xây dựng tài liệu XML

Tốt, vì vậy về cơ bản bạn đã có thể chuyển toàn bộ một bộ phim sang một thập kỷ mới. Lưu các thay đổi của bạn trở lại XML

tree = ET.parse('movies.xml')
root = tree.getroot()
2Kết luận

ElementTree là một thư viện Python quan trọng cho phép bạn phân tích cú pháp và điều hướng một tài liệu XML. Sử dụng ElementTree chia nhỏ tài liệu XML theo cấu trúc cây dễ làm việc với. Khi nghi ngờ, hãy in nó ra (______13_______9) - sử dụng câu lệnh in hữu ích này để xem toàn bộ tài liệu XML cùng một lúc

Làm cách nào để thêm thuộc tính vào tệp XML bằng Python?

Các hàm tạo cho Phần tử và Phần tử con bao gồm **extra , chấp nhận các thuộc tính làm đối số từ khóa . Điều này cho phép bạn thêm một số thuộc tính tùy ý. Bạn cũng có thể sử dụng. được đặt để thêm thuộc tính vào phần tử có sẵn.

Làm cách nào để cập nhật giá trị thuộc tính XML trong Python?

Giải pháp. Trước tiên, chúng tôi phân tích cú pháp tệp xml và thực hiện thao tác chứa chuỗi để kiểm tra xem tên sách có chứa “Python“. Nếu chuỗi chứa từ khóa, chúng ta sử dụng phương thức set() để thay đổi giá trị thuộc tính . Chạy mã ví dụ trên và bạn sẽ thấy tệp xml gốc đã được sửa đổi.

Làm cách nào để ghi dữ liệu vào tệp XML bằng Python?

Bây giờ để phù hợp với văn bản bên trong phần tử con, chúng ta phải sử dụng mục. văn bản và đặt giá trị chuỗi bằng toán tử gán. Nối đối tượng mục con với đối tượng gốc và ghi tệp XML bằng phương thức write() và chuyển tên tệp dưới dạng chuỗi

Làm cách nào để đọc giá trị thuộc tính trong XML bằng Python?

Lấy giá trị của các thuộc tính có liên quan . findall(level) , trong đó level là vị trí mong muốn (