xml.etree.ElementTree --- ElementTree XML API¶
Source code: Lib/xml/etree/ElementTree.py
Mô-đun xml.etree.ElementTree triển khai API đơn giản và hiệu quả để phân tích cú pháp và tạo dữ liệu XML.
Thay đổi trong phiên bản 3.3: Mô-đun này sẽ sử dụng triển khai nhanh bất cứ khi nào có sẵn.
Sắp loại bỏ từ phiên bản 3.3: Mô-đun xml.etree.cElementTree không được dùng nữa.
Ghi chú
Nếu bạn cần phân tích dữ liệu không đáng tin cậy hoặc chưa được xác thực, hãy xem bảo mật XML.
Hướng dẫn¶
Đây là một hướng dẫn ngắn về cách sử dụng xml.etree.ElementTree (gọi tắt là ET). Mục đích là để trình bày một số khối xây dựng và các khái niệm cơ bản của mô-đun.
cây và các phần tử XML¶
XML vốn là một định dạng dữ liệu có thứ bậc và cách tự nhiên nhất để biểu diễn nó là bằng một cái cây. ET có hai lớp cho mục đích này - ElementTree đại diện cho toàn bộ tài liệu XML dưới dạng cây và Element đại diện cho một nút duy nhất trong cây này. Các tương tác với toàn bộ tài liệu (đọc và ghi vào/từ tệp) thường được thực hiện ở cấp độ ElementTree. Tương tác với một phần tử XML duy nhất và các phần tử phụ của nó được thực hiện ở cấp độ Element.
Phân tích cú pháp XML¶
Chúng tôi sẽ sử dụng tài liệu country_data.xml XML hư cấu làm dữ liệu mẫu cho phần này:
<?xml phiên bản="1.0"?>
<dữ liệu>
<tên quốc gia="Liechtenstein">
<thứ hạng>1</thứ hạng>
<năm>2008</năm>
<gdppc>141100</gdppc>
<tên hàng xóm="Áo" Direction="E"/>
<tên hàng xóm="Thụy Sĩ" Direction="W"/>
</quốc gia>
<tên quốc gia="Xin-ga-po">
<thứ hạng>4</thứ hạng>
<năm>2011</năm>
<gdppc>59900</gdppc>
<tên hàng xóm="Malaysia" Direction="N"/>
</quốc gia>
<tên quốc gia="Panama">
<thứ hạng>68</thứ hạng>
<năm>2011</năm>
<gdppc>13600</gdppc>
<tên hàng xóm="Costa Rica" Direction="W"/>
<tên hàng xóm="Colombia" Direction="E"/>
</quốc gia>
</dữ liệu>
Chúng tôi có thể nhập dữ liệu này bằng cách đọc từ một tệp
nhập xml.etree.ElementTree dưới dạng ET
cây = ET.parse('country_data.xml')
root = cây.getroot()
Hoặc trực tiếp từ một chuỗi
root = ET.fromstring(country_data_as_string)
fromstring() phân tích cú pháp XML từ một chuỗi trực tiếp thành Element, đây là phần tử gốc của cây được phân tích cú pháp. Các hàm phân tích cú pháp khác có thể tạo tệp ElementTree. Kiểm tra tài liệu để chắc chắn.
Là một Element, root có thẻ và từ điển các thuộc tính:
>>> root.tag
'dữ liệu'
>>> root.attrib
{}
Nó cũng có các nút con mà chúng ta có thể lặp lại
>>> cho con trong root:
... print(child.tag, child.attrib)
...
đất nước {'name': 'Liechtenstein'}
quốc gia {'tên': 'Xin-ga-po'}
đất nước {'name': 'Panama'}
Các nút con được lồng vào nhau và chúng ta có thể truy cập các nút con cụ thể theo chỉ mục:
>>> gốc[0][1].văn bản
'2008'
Ghi chú
Không phải tất cả các phần tử của đầu vào XML sẽ kết thúc dưới dạng các phần tử của cây được phân tích cú pháp. Hiện tại, mô-đun này bỏ qua mọi nhận xét, hướng dẫn xử lý và khai báo loại tài liệu XML trong đầu vào. Tuy nhiên, các cây được xây dựng bằng API của mô-đun này thay vì phân tích cú pháp từ văn bản XML có thể có các nhận xét và hướng dẫn xử lý trong đó; chúng sẽ được đưa vào khi tạo đầu ra XML. Một khai báo loại tài liệu có thể được truy cập bằng cách chuyển một phiên bản TreeBuilder tùy chỉnh tới hàm tạo XMLParser.
Kéo API để phân tích cú pháp không chặn¶
Hầu hết các chức năng phân tích cú pháp do mô-đun này cung cấp đều yêu cầu phải đọc toàn bộ tài liệu cùng một lúc trước khi trả về bất kỳ kết quả nào. Có thể sử dụng XMLParser và nạp dữ liệu vào đó tăng dần, nhưng API đẩy gọi các phương thức trên mục tiêu gọi lại, mức này quá thấp và bất tiện cho hầu hết các nhu cầu. Đôi khi điều người dùng thực sự muốn là có thể phân tích cú pháp XML tăng dần mà không cần chặn các thao tác, đồng thời tận hưởng sự tiện lợi của các đối tượng Element được xây dựng hoàn chỉnh.
Công cụ mạnh mẽ nhất để thực hiện việc này là XMLPullParser. Nó không yêu cầu đọc chặn để lấy dữ liệu XML và thay vào đó được cung cấp dữ liệu tăng dần bằng các lệnh gọi XMLPullParser.feed(). Để lấy các phần tử XML được phân tích cú pháp, hãy gọi XMLPullParser.read_events(). Đây là một ví dụ:
>>> trình phân tích cú pháp = ET.XMLPullParser(['start', 'end'])
>>> Parser.feed('<mytag>sometext')
>>> danh sách(parser.read_events())
[('bắt đầu', <Thành phần 'mytag' tại 0x7fa66db2be58>)]
>>> Parser.feed(' thêm văn bản</mytag>')
>>> cho sự kiện, elem trong parser.read_events():
... in(sự kiện)
... print(elem.tag, 'text=', elem.text)
...
kết thúc
văn bản mytag= văn bản nào đó thêm văn bản
Trường hợp sử dụng rõ ràng là các ứng dụng hoạt động theo kiểu không chặn trong đó dữ liệu XML đang được nhận từ ổ cắm hoặc đọc tăng dần từ một số thiết bị lưu trữ. Trong những trường hợp như vậy, việc chặn đọc là không thể chấp nhận được.
Vì quá linh hoạt nên XMLPullParser có thể bất tiện khi sử dụng cho những trường hợp sử dụng đơn giản hơn. Nếu bạn không bận tâm đến việc ứng dụng của mình chặn việc đọc dữ liệu XML nhưng vẫn muốn có khả năng phân tích cú pháp gia tăng, hãy xem iterparse(). Nó có thể hữu ích khi bạn đang đọc một tài liệu XML lớn và không muốn giữ toàn bộ tài liệu đó trong bộ nhớ.
Khi cần phản hồi immediate thông qua các sự kiện, việc gọi phương thức XMLPullParser.flush() có thể giúp giảm độ trễ; hãy đảm bảo nghiên cứu các ghi chú bảo mật liên quan.
Tìm kiếm yếu tố thú vị¶
Element có một số phương pháp hữu ích giúp lặp lại đệ quy trên tất cả các cây con bên dưới nó (con của nó, con của chúng, v.v.). Ví dụ: Element.iter():
>>> cho hàng xóm trong root.iter('neighbor'):
... print(neighbor.attrib)
...
{'name': 'Áo', 'hướng': 'E'}
{'name': 'Thụy Sĩ', 'hướng': 'W'}
{'tên': 'Malaysia', 'hướng': 'N'}
{'name': 'Costa Rica', 'hướng': 'W'}
{'name': 'Colombia', 'hướng': 'E'}
Element.findall() chỉ tìm thấy các phần tử có thẻ là phần tử con trực tiếp của phần tử hiện tại. Element.find() tìm thấy first con bằng một thẻ cụ thể và Element.text truy cập nội dung văn bản của phần tử. Element.get() truy cập các thuộc tính của phần tử
>>> cho quốc gia trong root.findall('country'):
... thứ hạng = country.find('rank').text
... tên = country.get('name')
... print(tên, cấp bậc)
...
Liechtenstein 1
Singapore 4
Panama 68
Có thể thực hiện đặc tả phức tạp hơn về các phần tử cần tìm bằng cách sử dụng XPath.
Sửa đổi tệp XML¶
ElementTree cung cấp một cách đơn giản để xây dựng tài liệu XML và ghi chúng vào tệp. Phương pháp ElementTree.write() phục vụ mục đích này.
Sau khi được tạo, một đối tượng Element có thể được điều khiển bằng cách thay đổi trực tiếp các trường của nó (chẳng hạn như Element.text), thêm và sửa đổi các thuộc tính (phương thức Element.set()), cũng như thêm các phần tử con mới (ví dụ với Element.append()).
Giả sử chúng tôi muốn thêm một thuộc tính vào thứ hạng của mỗi quốc gia và thêm thuộc tính updated vào thành phần thứ hạng
>>> để biết thứ hạng trong root.iter('rank'):
... new_rank = int(rank.text) + 1
... thứ hạng.text = str(new_rank)
... thứ hạng.set('đã cập nhật', 'có')
...
>>> tree.write('output.xml')
Zz000zz của chúng tôi bây giờ trông như thế này:
<?xml phiên bản="1.0"?>
<dữ liệu>
<tên quốc gia="Liechtenstein">
<rank đã cập nhật="có">2</rank>
<năm>2008</năm>
<gdppc>141100</gdppc>
<tên hàng xóm="Áo" Direction="E"/>
<tên hàng xóm="Thụy Sĩ" Direction="W"/>
</quốc gia>
<tên quốc gia="Xin-ga-po">
<rank đã cập nhật="có">5</rank>
<năm>2011</năm>
<gdppc>59900</gdppc>
<tên hàng xóm="Malaysia" Direction="N"/>
</quốc gia>
<tên quốc gia="Panama">
<rank đã cập nhật="có">69</rank>
<năm>2011</năm>
<gdppc>13600</gdppc>
<tên hàng xóm="Costa Rica" Direction="W"/>
<tên hàng xóm="Colombia" Direction="E"/>
</quốc gia>
</dữ liệu>
Chúng ta có thể loại bỏ các phần tử bằng Element.remove(). Giả sử chúng tôi muốn xóa tất cả các quốc gia có thứ hạng cao hơn 50:
>>> cho quốc gia trong root.findall('country'):
... # using root.findall() để tránh bị xóa trong quá trình truyền tải
... thứ hạng = int(country.find('rank').text)
... nếu thứ hạng > 50:
... root.remove(quốc gia)
...
>>> tree.write('output.xml')
Lưu ý rằng việc sửa đổi đồng thời trong khi lặp có thể dẫn đến sự cố, giống như khi lặp và sửa đổi danh sách hoặc ký tự Python. Do đó, ví dụ trước tiên thu thập tất cả các phần tử phù hợp với root.findall() và chỉ sau đó lặp lại danh sách kết quả phù hợp.
Zz000zz của chúng tôi bây giờ trông như thế này:
<?xml phiên bản="1.0"?>
<dữ liệu>
<tên quốc gia="Liechtenstein">
<rank đã cập nhật="có">2</rank>
<năm>2008</năm>
<gdppc>141100</gdppc>
<tên hàng xóm="Áo" Direction="E"/>
<tên hàng xóm="Thụy Sĩ" Direction="W"/>
</quốc gia>
<tên quốc gia="Xin-ga-po">
<rank đã cập nhật="có">5</rank>
<năm>2011</năm>
<gdppc>59900</gdppc>
<tên hàng xóm="Malaysia" Direction="N"/>
</quốc gia>
</dữ liệu>
Xây dựng tài liệu XML¶
Hàm SubElement() cũng cung cấp một cách thuận tiện để tạo các phần tử phụ mới cho một phần tử nhất định
>>> a = ET.Element('a')
>>> b = ET.SubElement(a, 'b')
>>> c = ET.SubElement(a, 'c')
>>> d = ET.SubElement(c, 'd')
>>> ET.dump(a)
<a><b /><c><d /></c></a>
Phân tích cú pháp XML bằng không gian tên¶
Nếu đầu vào XML có namespaces, các thẻ và thuộc tính có tiền tố ở dạng prefix:sometag sẽ được mở rộng thành {uri}sometag trong đó prefix được thay thế bằng URI đầy đủ. Ngoài ra, nếu có default namespace, URI đầy đủ đó sẽ được thêm vào trước tất cả các thẻ không có tiền tố.
Dưới đây là một ví dụ về XML kết hợp hai không gian tên, một không gian tên có tiền tố "hư cấu" và không gian tên còn lại đóng vai trò là không gian tên mặc định:
<?xml phiên bản="1.0"?>
<diễn viên xmlns:fictional="http://characters.example.com"
xmlns="http://people.example.com">
<diễn viên>
<name>John Cleese</name>
<fictional:character>Lancelot</fictional:character>
<fictional:character>Archie Leach</fictional:character>
</ diễn viên>
<diễn viên>
<name>Eric nhàn rỗi</name>
<fictional:character>Ngài Robin</fictional:character>
<fictional:character>Gunther</fictional:character>
<fictional:character>Chỉ huy Clement</fictional:character>
</ diễn viên>
</ diễn viên>
Một cách để tìm kiếm và khám phá ví dụ về XML này là thêm URI theo cách thủ công vào mọi thẻ hoặc thuộc tính trong xpath của find() hoặc findall():
root = fromstring(xml_text)
dành cho diễn viên trong root.findall('{http://people.example.com}actor'):
tên = diễn viên.find('{http://people.example.com}name')
in(name.text)
cho char trong diễn viên.findall('{http://characters.example.com}character'):
print(' |-->', char.text)
Cách tốt hơn để tìm kiếm ví dụ về XML được đặt tên là tạo một từ điển với các tiền tố của riêng bạn và sử dụng chúng trong các chức năng tìm kiếm:
ns = {'real_person': 'http://people.example.com',
'vai trò': 'http://characters.example.com'}
dành cho diễn viên trong root.findall('real_person:actor', ns):
name = diễn viên.find('real_person:name', ns)
in(name.text)
cho char trong diễn viên.findall('role:character', ns):
print(' |-->', char.text)
Hai cách tiếp cận này đều xuất ra
John Cleese
|--> Lancelot
|--> Archie Leach
Eric nhàn rỗi
|--> Ngài Robin
|--> Gunther
|--> Chỉ huy Clement
Hỗ trợ XPath¶
Mô-đun này cung cấp hỗ trợ hạn chế cho XPath expressions để định vị các phần tử trong cây. Mục tiêu là hỗ trợ một tập hợp con nhỏ của cú pháp viết tắt; công cụ XPath đầy đủ nằm ngoài phạm vi của mô-đun.
Ví dụ¶
Đây là một ví dụ thể hiện một số khả năng XPath của mô-đun. Chúng tôi sẽ sử dụng tài liệu countrydata XML từ phần Parsing XML:
nhập xml.etree.ElementTree dưới dạng ET
root = ET.fromstring(countrydata)
yếu tố # Top-level
root.findall(".")
# All cháu 'hàng xóm' của con cháu 'nhà quê' cấp cao
# elements
root.findall("./country/neighbor")
# Nodes with name=' Singapore' có con 'năm'
root.findall(".//year/..[@name=' Singapore']")
# nút 'năm' là con của nút có tên=' Singapore'
root.findall(".//*[@name=' Singapore']/year")
Các nút 'hàng xóm' # All là con thứ hai của cha mẹ chúng
root.findall(".//neighbor[2]")
Đối với XML có không gian tên, hãy sử dụng ký hiệu {namespace}tag đủ điều kiện thông thường
# All dublin-core thẻ "tiêu đề" trong tài liệu
root.findall(".//{http://purl.org/dc/elements/1.1/}title")
Cú pháp XPath được hỗ trợ¶
Cú pháp |
Ý nghĩa |
|---|---|
|
Chọn tất cả các phần tử con có thẻ đã cho. Ví dụ: Thay đổi trong phiên bản 3.8: Hỗ trợ cho ký tự đại diện dấu sao đã được thêm vào. |
|
Chọn tất cả các phần tử con, bao gồm cả nhận xét và hướng dẫn xử lý. Ví dụ: |
|
Chọn nút hiện tại. Điều này chủ yếu hữu ích ở phần đầu của đường dẫn, để chỉ ra rằng đó là đường dẫn tương đối. |
|
Chọn tất cả các phần tử con, ở tất cả các cấp bên dưới phần tử hiện tại. Ví dụ: |
|
Chọn phần tử cha. Trả về |
|
Chọn tất cả các phần tử có thuộc tính đã cho. |
|
Chọn tất cả các phần tử mà thuộc tính đã cho có giá trị đã cho. Giá trị không thể chứa dấu ngoặc kép. |
|
Chọn tất cả các phần tử mà thuộc tính đã cho không có giá trị đã cho. Giá trị không thể chứa dấu ngoặc kép. Added in version 3.10. |
|
Chọn tất cả các phần tử có phần tử con có tên là |
|
Chọn tất cả các phần tử có nội dung văn bản đầy đủ, bao gồm cả phần tử con, bằng Added in version 3.7. |
|
Chọn tất cả các phần tử có nội dung văn bản đầy đủ, bao gồm cả phần tử con, không bằng Added in version 3.10. |
|
Chọn tất cả các phần tử có phần tử con tên là |
|
Chọn tất cả các phần tử có phần tử con tên là Added in version 3.10. |
|
Chọn tất cả các phần tử được đặt ở vị trí nhất định. Vị trí có thể là số nguyên (1 là vị trí đầu tiên), biểu thức |
Các vị từ (biểu thức trong dấu ngoặc vuông) phải được đặt trước bởi tên thẻ, dấu hoa thị hoặc một vị từ khác. Vị từ position phải được đặt trước tên thẻ.
Tài liệu tham khảo¶
Chức năng¶
- xml.etree.ElementTree.canonicalize(xml_data=None, *, out=None, from_file=None, **options)¶
hàm biến đổi C14N 2.0.
Canonicalization là một cách để bình thường hóa đầu ra XML theo cách cho phép so sánh từng byte và chữ ký số. Nó làm giảm sự tự do mà các bộ nối tiếp XML có và thay vào đó tạo ra một biểu diễn XML hạn chế hơn. Các hạn chế chính liên quan đến việc sắp xếp các khai báo vùng tên, thứ tự các thuộc tính và khoảng trắng không thể bỏ qua.
Hàm này lấy chuỗi dữ liệu XML (xml_data) hoặc đường dẫn tệp hoặc đối tượng giống tệp (from_file) làm đầu vào, chuyển đổi nó thành dạng chuẩn và ghi nó ra bằng cách sử dụng đối tượng tệp *out*(-like), nếu được cung cấp hoặc trả về dưới dạng chuỗi văn bản nếu không. Tệp đầu ra nhận được văn bản, không phải byte. Do đó, nó phải được mở ở chế độ văn bản với mã hóa
utf-8.Sử dụng điển hình:
xml_data = "<root>...</root>" in(chuẩn hóa(xml_data)) với open("c14n_output.xml", mode='w',coding='utf-8') là out_file: chuẩn hóa(xml_data, out=out_file) với open("c14n_output.xml", mode='w',coding='utf-8') là out_file: chuẩn hóa(from_file="inputfile.xml", out=out_file)
Cấu hình options như sau:
with_comments: đặt thành true để bao gồm các nhận xét (mặc định: sai)
- strip_text: đặt thành true để loại bỏ khoảng trắng trước và sau nội dung văn bản
(mặc định: sai)
- rewrite_prefixes: đặt thành true để thay thế tiền tố vùng tên bằng "n{number}"
(mặc định: sai)
- qname_aware_tags: một tập hợp các tên thẻ nhận biết qname trong đó có tiền tố
nên được thay thế trong nội dung văn bản (mặc định: trống)
- qname_aware_attrs: một tập hợp các tên thuộc tính nhận biết qname trong đó có tiền tố
nên được thay thế trong nội dung văn bản (mặc định: trống)
exclude_attrs: một tập hợp các tên thuộc tính không nên được tuần tự hóa
exclude_tags: tập hợp các tên thẻ không nên được tuần tự hóa
Trong danh sách tùy chọn ở trên, "một tập hợp" đề cập đến bất kỳ tập hợp hoặc chuỗi lặp nào, không yêu cầu thứ tự.
Added in version 3.8.
- xml.etree.ElementTree.Comment(text=None)¶
Nhà máy sản xuất phần tử bình luận. Hàm xuất xưởng này tạo ra một phần tử đặc biệt sẽ được tuần tự hóa dưới dạng nhận xét XML bởi trình tuần tự hóa tiêu chuẩn. Chuỗi nhận xét có thể là chuỗi byte hoặc chuỗi Unicode. text là một chuỗi chứa chuỗi nhận xét. Trả về một thể hiện phần tử đại diện cho một nhận xét.
Lưu ý rằng
XMLParserbỏ qua các nhận xét trong đầu vào thay vì tạo đối tượng nhận xét cho chúng. MộtElementTreesẽ chỉ chứa các nút nhận xét nếu chúng được chèn vào cây bằng một trong các phương thứcElement.
- xml.etree.ElementTree.dump(elem)¶
Viết cây phần tử hoặc cấu trúc phần tử vào sys.stdout. Chức năng này chỉ nên được sử dụng để gỡ lỗi.
Định dạng đầu ra chính xác phụ thuộc vào việc triển khai. Trong phiên bản này, nó được viết dưới dạng tệp XML thông thường.
elem là một cây phần tử hoặc một phần tử riêng lẻ.
Thay đổi trong phiên bản 3.8: Hàm
dump()hiện giữ nguyên thứ tự thuộc tính do người dùng chỉ định.
- xml.etree.ElementTree.fromstring(text, parser=None)¶
Phân tích phần XML từ một hằng chuỗi. Tương tự với
XML()text là một chuỗi chứa dữ liệu XML. parser là một phiên bản trình phân tích cú pháp tùy chọn. Nếu không được cung cấp, trình phân tích cú phápXMLParsertiêu chuẩn sẽ được sử dụng. Trả về một phiên bảnElement.
- xml.etree.ElementTree.fromstringlist(sequence, parser=None)¶
Phân tích tài liệu XML từ một chuỗi các đoạn chuỗi. sequence là một danh sách hoặc chuỗi khác chứa các đoạn dữ liệu XML. parser là một phiên bản trình phân tích cú pháp tùy chọn. Nếu không được cung cấp, trình phân tích cú pháp
XMLParsertiêu chuẩn sẽ được sử dụng. Trả về một phiên bảnElement.Added in version 3.2.
- xml.etree.ElementTree.indent(tree, space=' ', level=0)¶
Nối khoảng trắng vào cây con để thụt lề cây một cách trực quan. Điều này có thể được sử dụng để tạo đầu ra XML được in đẹp. tree có thể là Element hoặc ElementTree. space là chuỗi khoảng trắng sẽ được chèn cho mỗi mức thụt lề, mặc định là hai ký tự khoảng trắng. Để thụt lề một phần cây con bên trong cây đã được thụt lề, hãy chuyển mức thụt đầu dòng ban đầu là level.
Added in version 3.9.
- xml.etree.ElementTree.iselement(element)¶
Kiểm tra xem một đối tượng có vẻ là một đối tượng phần tử hợp lệ hay không. element là một phiên bản phần tử. Trả về
Truenếu đây là một đối tượng phần tử.
- xml.etree.ElementTree.iterparse(source, events=None, parser=None)¶
Phân tích dần dần phần XML thành cây phần tử và báo cáo những gì đang diễn ra cho người dùng. source là tên tệp hoặc file object chứa dữ liệu XML. events là một chuỗi các sự kiện cần báo cáo lại. Các sự kiện được hỗ trợ là các chuỗi
"start","end","comment","pi","start-ns"và"end-ns"(các sự kiện "ns" được sử dụng để lấy thông tin chi tiết về không gian tên). Nếu events bị bỏ qua, chỉ các sự kiện"end"được báo cáo. parser là một phiên bản trình phân tích cú pháp tùy chọn. Nếu không được cung cấp, trình phân tích cú phápXMLParsertiêu chuẩn sẽ được sử dụng. parser phải là lớp con củaXMLParservà chỉ có thể sử dụngTreeBuildermặc định làm mục tiêu. Trả về một iterator cung cấp các cặp(event, elem); nó có thuộc tínhroottham chiếu phần tử gốc của cây XML sau khi source được đọc đầy đủ. Trình lặp có phương thứcclose()đóng đối tượng tệp bên trong nếu source là tên tệp.Lưu ý rằng mặc dù
iterparse()xây dựng cây tăng dần nhưng nó lại gây ra sự cố chặn việc đọc trên source (hoặc tệp mà nó đặt tên). Do đó, nó không phù hợp với các ứng dụng không thể thực hiện chặn việc đọc. Để biết phân tích cú pháp không chặn hoàn toàn, hãy xemXMLPullParser.Ghi chú
iterparse()chỉ đảm bảo rằng nó đã nhìn thấy ký tự ">" của thẻ bắt đầu khi nó phát ra sự kiện "bắt đầu", do đó các thuộc tính được xác định, nhưng nội dung của thuộc tính văn bản và đuôi không được xác định tại thời điểm đó. Điều tương tự cũng áp dụng cho phần tử con; họ có thể có mặt hoặc không.Nếu bạn cần một phần tử được điền đầy đủ, thay vào đó hãy tìm các sự kiện "kết thúc".
Sắp loại bỏ từ phiên bản 3.4: Đối số parser.
Thay đổi trong phiên bản 3.8: Các sự kiện
commentvàpiđã được thêm vào.Thay đổi trong phiên bản 3.13: Đã thêm phương thức
close().
- xml.etree.ElementTree.parse(source, parser=None)¶
Phân tích phần XML thành cây phần tử. source là tên tệp hoặc đối tượng tệp chứa dữ liệu XML. parser là một phiên bản trình phân tích cú pháp tùy chọn. Nếu không được cung cấp, trình phân tích cú pháp
XMLParsertiêu chuẩn sẽ được sử dụng. Trả về một phiên bảnElementTree.
- xml.etree.ElementTree.ProcessingInstruction(target, text=None)¶
Nhà máy sản xuất phần tử PI. Hàm xuất xưởng này tạo ra một phần tử đặc biệt sẽ được tuần tự hóa dưới dạng lệnh xử lý XML. target là một chuỗi chứa mục tiêu PI. text là một chuỗi chứa nội dung PI, nếu được cung cấp. Trả về một thể hiện phần tử, biểu diễn một lệnh xử lý.
Lưu ý rằng
XMLParserbỏ qua các hướng dẫn xử lý trong đầu vào thay vì tạo đối tượng PI cho chúng. MộtElementTreesẽ chỉ chứa các nút lệnh xử lý nếu chúng được chèn vào cây bằng một trong các phương thứcElement.
- xml.etree.ElementTree.register_namespace(prefix, uri)¶
Đăng ký tiền tố không gian tên. Cơ quan đăng ký có tính toàn cầu và mọi ánh xạ hiện có cho tiền tố đã cho hoặc vùng tên URI sẽ bị xóa. prefix là tiền tố không gian tên. uri là một không gian tên uri. Các thẻ và thuộc tính trong không gian tên này sẽ được tuần tự hóa với tiền tố đã cho, nếu có thể.
Added in version 3.2.
- xml.etree.ElementTree.SubElement(parent, tag, attrib={}, **extra)¶
Nhà máy phụ kiện. Hàm này tạo một thể hiện phần tử và nối nó vào một phần tử hiện có.
Tên phần tử, tên thuộc tính và giá trị thuộc tính có thể là chuỗi byte hoặc chuỗi Unicode. parent là phần tử gốc. tag là tên phần tử con. attrib là một từ điển tùy chọn, chứa các thuộc tính phần tử. extra chứa các thuộc tính bổ sung, được đưa ra dưới dạng đối số từ khóa. Trả về một thể hiện phần tử.
- xml.etree.ElementTree.tostring(element, encoding='us-ascii', method='xml', *, xml_declaration=None, default_namespace=None, short_empty_elements=True)¶
Tạo biểu diễn chuỗi của phần tử XML, bao gồm tất cả các phần tử phụ. element là một phiên bản
Element. encoding [1] là mã hóa đầu ra (mặc định là US-ASCII). Sử dụngencoding="unicode"để tạo chuỗi Unicode (nếu không, chuỗi byte sẽ được tạo). method là"xml","html"hoặc"text"(mặc định là"xml"). xml_declaration, default_namespace và short_empty_elements có ý nghĩa tương tự như trongElementTree.write(). Trả về một chuỗi được mã hóa (tùy chọn) chứa dữ liệu XML.Thay đổi trong phiên bản 3.4: Đã thêm tham số short_empty_elements.
Thay đổi trong phiên bản 3.8: Đã thêm thông số xml_declaration và default_namespace.
Thay đổi trong phiên bản 3.8: Hàm
tostring()hiện giữ nguyên thứ tự thuộc tính do người dùng chỉ định.
- xml.etree.ElementTree.tostringlist(element, encoding='us-ascii', method='xml', *, xml_declaration=None, default_namespace=None, short_empty_elements=True)¶
Tạo biểu diễn chuỗi của phần tử XML, bao gồm tất cả các phần tử phụ. element là một phiên bản
Element. encoding [1] là mã hóa đầu ra (mặc định là US-ASCII). Sử dụngencoding="unicode"để tạo chuỗi Unicode (nếu không, chuỗi byte sẽ được tạo). method là"xml","html"hoặc"text"(mặc định là"xml"). xml_declaration, default_namespace và short_empty_elements có ý nghĩa tương tự như trongElementTree.write(). Trả về danh sách các chuỗi được mã hóa (tùy chọn) chứa dữ liệu XML. Nó không đảm bảo bất kỳ trình tự cụ thể nào, ngoại trừb"".join(tostringlist(element)) == tostring(element).Added in version 3.2.
Thay đổi trong phiên bản 3.4: Đã thêm tham số short_empty_elements.
Thay đổi trong phiên bản 3.8: Đã thêm thông số xml_declaration và default_namespace.
Thay đổi trong phiên bản 3.8: Hàm
tostringlist()hiện giữ nguyên thứ tự thuộc tính do người dùng chỉ định.
- xml.etree.ElementTree.XML(text, parser=None)¶
Phân tích phần XML từ một hằng chuỗi. Hàm này có thể được sử dụng để nhúng "chữ XML" trong mã Python. text là một chuỗi chứa dữ liệu XML. parser là một phiên bản trình phân tích cú pháp tùy chọn. Nếu không được cung cấp, trình phân tích cú pháp
XMLParsertiêu chuẩn sẽ được sử dụng. Trả về một phiên bảnElement.
- xml.etree.ElementTree.XMLID(text, parser=None)¶
Phân tích phần XML từ một hằng chuỗi và cũng trả về một từ điển ánh xạ từ phần tử id:s đến phần tử. text là một chuỗi chứa dữ liệu XML. parser là một phiên bản trình phân tích cú pháp tùy chọn. Nếu không được cung cấp, trình phân tích cú pháp
XMLParsertiêu chuẩn sẽ được sử dụng. Trả về một bộ chứa phiên bảnElementvà một từ điển.
XBao gồm hỗ trợ¶
Mô-đun này cung cấp hỗ trợ hạn chế cho XInclude directives, thông qua mô-đun trợ giúp xml.etree.ElementInclude. Mô-đun này có thể được sử dụng để chèn cây con và chuỗi văn bản vào cây phần tử, dựa trên thông tin trong cây.
Ví dụ¶
Đây là ví dụ minh họa việc sử dụng mô-đun XInclude. Để đưa tài liệu XML vào tài liệu hiện tại, hãy sử dụng phần tử {http://www.w3.org/2001/XInclude}include và đặt thuộc tính parse thành "xml", đồng thời sử dụng thuộc tính href để chỉ định tài liệu cần đưa vào.
<?xml phiên bản="1.0"?>
<tài liệu xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include href="source.xml" pars="xml" />
</ tài liệu>
Theo mặc định, thuộc tính href được coi là tên tệp. Bạn có thể sử dụng trình tải tùy chỉnh để ghi đè hành vi này. Cũng lưu ý rằng trình trợ giúp tiêu chuẩn không hỗ trợ cú pháp XPointer.
Để xử lý tệp này, hãy tải nó như bình thường và chuyển phần tử gốc vào mô-đun xml.etree.ElementTree:
từ xml.etree nhập ElementTree, ElementInclude
cây = ElementTree.parse("document.xml")
root = cây.getroot()
ElementInclude.include(root)
Mô-đun ElementInclude thay thế phần tử {http://www.w3.org/2001/XInclude}include bằng phần tử gốc từ tài liệu source.xml. Kết quả có thể trông giống như thế này:
<tài liệu xmlns:xi="http://www.w3.org/2001/XInclude">
<para>Đây là một đoạn văn.</para>
</ tài liệu>
Nếu thuộc tính parse bị bỏ qua, nó sẽ mặc định là "xml". Thuộc tính href là bắt buộc.
Để bao gồm tài liệu văn bản, hãy sử dụng phần tử {http://www.w3.org/2001/XInclude}include và đặt thuộc tính parse thành "text":
<?xml phiên bản="1.0"?>
<tài liệu xmlns:xi="http://www.w3.org/2001/XInclude">
Bản quyền (c) <xi:include href="year.txt" pars="text" />.
</ tài liệu>
Kết quả có thể trông giống như:
<tài liệu xmlns:xi="http://www.w3.org/2001/XInclude">
Bản quyền (c) 2003.
</ tài liệu>
Tài liệu tham khảo¶
Chức năng¶
- xml.etree.ElementInclude.default_loader(href, parse, encoding=None)¶
Trình tải mặc định. Trình tải mặc định này đọc tài nguyên đi kèm từ đĩa. href là URL. parse dành cho chế độ phân tích cú pháp "xml" hoặc "văn bản". encoding là một mã hóa văn bản tùy chọn. Nếu không được cung cấp, mã hóa là
utf-8. Trả về tài nguyên đã mở rộng. Nếu chế độ phân tích cú pháp là"xml"thì đây là phiên bảnElement. Nếu chế độ phân tích cú pháp là"text"thì đây là một chuỗi. Nếu trình tải bị lỗi, nó có thể trả vềNonehoặc đưa ra một ngoại lệ.
- xml.etree.ElementInclude.include(elem, loader=None, base_url=None, max_depth=6)¶
Hàm này mở rộng các chỉ thị XInclude tại chỗ trong cây được trỏ bởi elem. elem là
Elementgốc hoặc một phiên bảnElementTreeđể tìm phần tử đó. loader là trình tải tài nguyên tùy chọn. Nếu bỏ qua, nó mặc định làdefault_loader(). Nếu được cung cấp, nó phải là một lệnh gọi có thể triển khai giao diện giống nhưdefault_loader(). base_url là URL cơ sở của tệp gốc, để giải quyết các tham chiếu tệp tương đối. max_depth là số lượng bao gồm đệ quy tối đa. Hạn chế để giảm nguy cơ bùng nổ nội dung độc hại. Vượt quaNoneđể vô hiệu hóa giới hạn.Thay đổi trong phiên bản 3.9: Đã thêm thông số base_url và max_depth.
Đối tượng phần tử¶
- class xml.etree.ElementTree.Element(tag, attrib={}, **extra)¶
Lớp phần tử. Lớp này định nghĩa giao diện Element và cung cấp cách triển khai tham chiếu của giao diện này.
Tên phần tử, tên thuộc tính và giá trị thuộc tính có thể là chuỗi byte hoặc chuỗi Unicode. tag là tên phần tử. attrib là một từ điển tùy chọn, chứa các thuộc tính phần tử. extra chứa các thuộc tính bổ sung, được đưa ra dưới dạng đối số từ khóa.
- tag¶
Một chuỗi xác định loại dữ liệu mà phần tử này đại diện (nói cách khác là loại phần tử).
- text¶
- tail¶
Các thuộc tính này có thể được sử dụng để chứa dữ liệu bổ sung liên quan đến phần tử. Giá trị của chúng thường là các chuỗi nhưng có thể là bất kỳ đối tượng nào dành riêng cho ứng dụng. Nếu phần tử được tạo từ tệp XML, thuộc tính text giữ văn bản giữa thẻ bắt đầu của phần tử và thẻ con hoặc thẻ kết thúc đầu tiên của nó hoặc
Nonevà thuộc tính tail giữ văn bản giữa thẻ kết thúc của phần tử và thẻ tiếp theo hoặcNone. Đối với dữ liệu XML<a><b>1<c>2<d/>3</c></b>4</a>
phần tử a có
Nonecho cả hai thuộc tính text và tail, phần tử b có text"1"và tail"4", phần tử c có text"2"và tailNone, và phần tử d có textNonevà tail"3".Để thu thập văn bản bên trong của một phần tử, hãy xem
itertext(), ví dụ"".join(element.itertext()).Ứng dụng có thể lưu trữ các đối tượng tùy ý trong các thuộc tính này.
- attrib¶
Một từ điển chứa các thuộc tính của phần tử. Lưu ý rằng mặc dù giá trị attrib luôn là một từ điển Python thực sự có thể thay đổi, nhưng việc triển khai ElementTree có thể chọn sử dụng một biểu diễn nội bộ khác và chỉ tạo từ điển nếu ai đó yêu cầu. Để tận dụng những cách triển khai như vậy, hãy sử dụng các phương pháp từ điển bên dưới bất cứ khi nào có thể.
Các phương thức giống như từ điển sau đây hoạt động trên các thuộc tính phần tử.
- clear()¶
Đặt lại một phần tử. Hàm này loại bỏ tất cả các phần tử con, xóa tất cả các thuộc tính và đặt thuộc tính văn bản và đuôi thành
None.
- get(key, default=None)¶
Lấy thuộc tính phần tử có tên key.
Trả về giá trị thuộc tính hoặc default nếu không tìm thấy thuộc tính.
- items()¶
Trả về các thuộc tính phần tử dưới dạng một chuỗi các cặp (tên, giá trị). Các thuộc tính được trả về theo thứ tự tùy ý.
- keys()¶
Trả về tên thuộc tính của các phần tử dưới dạng danh sách. Tên được trả về theo thứ tự tùy ý.
- set(key, value)¶
Đặt thuộc tính key trên phần tử thành value.
Các phương pháp sau đây hoạt động trên các phần tử con (phần tử con).
- append(subelement)¶
Thêm phần tử subelement vào cuối danh sách các phần tử con bên trong của phần tử này. Tăng
TypeErrornếu subelement không phải làElement.
- extend(subelements)¶
Nối subelements từ một phần tử có thể lặp lại. Tăng
TypeErrornếu phần tử con không phải làElement.Added in version 3.2.
- find(match, namespaces=None)¶
Tìm phần tử con đầu tiên khớp với match. match có thể là tên thẻ hoặc path. Trả về một thể hiện phần tử hoặc
None. namespaces là ánh xạ tùy chọn từ tiền tố không gian tên đến tên đầy đủ. Chuyển''làm tiền tố để di chuyển tất cả các tên thẻ không có tiền tố trong biểu thức vào không gian tên đã cho.
- findall(match, namespaces=None)¶
Tìm tất cả các phần tử con phù hợp, theo tên thẻ hoặc path. Trả về danh sách chứa tất cả các phần tử khớp theo thứ tự tài liệu. namespaces là ánh xạ tùy chọn từ tiền tố vùng tên đến tên đầy đủ. Chuyển
''làm tiền tố để di chuyển tất cả các tên thẻ không có tiền tố trong biểu thức vào không gian tên đã cho.
- findtext(match, default=None, namespaces=None)¶
Tìm văn bản cho phần tử con đầu tiên khớp với match. match có thể là tên thẻ hoặc path. Trả về nội dung văn bản của phần tử phù hợp đầu tiên hoặc default nếu không tìm thấy phần tử nào. Lưu ý rằng nếu phần tử phù hợp không có nội dung văn bản thì chuỗi trống sẽ được trả về. namespaces là ánh xạ tùy chọn từ tiền tố không gian tên đến tên đầy đủ. Chuyển
''làm tiền tố để di chuyển tất cả các tên thẻ không có tiền tố trong biểu thức vào không gian tên đã cho.
- insert(index, subelement)¶
Chèn subelement vào vị trí đã cho trong phần tử này. Tăng
TypeErrornếu subelement không phải làElement.
- iter(tag=None)¶
Tạo một cây iterator với phần tử hiện tại là gốc. Trình vòng lặp lặp lại phần tử này và tất cả các phần tử bên dưới nó, theo thứ tự tài liệu (độ sâu trước). Nếu tag không phải là
Nonehoặc'*', thì chỉ các phần tử có thẻ bằng tag mới được trả về từ trình vòng lặp. Nếu cấu trúc cây bị sửa đổi trong quá trình lặp, kết quả sẽ không được xác định.Added in version 3.2.
- iterfind(match, namespaces=None)¶
Tìm tất cả các phần tử con phù hợp, theo tên thẻ hoặc path. Trả về một iterable mang lại tất cả các phần tử phù hợp theo thứ tự tài liệu. namespaces là ánh xạ tùy chọn từ tiền tố vùng tên đến tên đầy đủ.
Added in version 3.2.
- itertext()¶
Tạo một trình vòng lặp văn bản. Trình vòng lặp lặp qua phần tử này và tất cả các phần tử con, theo thứ tự tài liệu và trả về tất cả văn bản bên trong.
Added in version 3.2.
- makeelement(tag, attrib)¶
Tạo một đối tượng phần tử mới cùng loại với phần tử này. Đừng gọi phương thức này, thay vào đó hãy sử dụng hàm xuất xưởng
SubElement().
- remove(subelement)¶
Loại bỏ subelement khỏi phần tử. Không giống như các phương thức find*, phương thức này so sánh các phần tử dựa trên danh tính cá thể, không dựa trên giá trị hoặc nội dung thẻ.
Các đối tượng
Elementcũng hỗ trợ các phương thức loại trình tự sau để làm việc với các phần tử con:__delitem__(),__getitem__(),__setitem__(),__len__().Thận trọng: Các phần tử không có phần tử con sẽ kiểm tra dưới dạng
False. Trong bản phát hành Python trong tương lai, tất cả các phần tử sẽ kiểm tra dưới dạngTruebất kể các phần tử phụ có tồn tại hay không. Thay vào đó, hãy ưu tiên các bài kiểm tralen(elem)hoặcelem is not Nonerõ ràng.:phần tử = root.find('foo') nếu không phải là phần tử: # careful! print("không tìm thấy phần tử hoặc phần tử không có phần tử con") nếu phần tử là Không có: print("không tìm thấy phần tử")
Thay đổi trong phiên bản 3.12: Kiểm tra giá trị thực của một Phần tử sẽ phát ra
DeprecationWarning.Trước Python 3.8, thứ tự tuần tự hóa các thuộc tính XML của các phần tử đã được dự đoán một cách giả tạo bằng cách sắp xếp các thuộc tính theo tên của chúng. Dựa trên thứ tự ký tự hiện đã được đảm bảo, việc sắp xếp lại tùy ý này đã bị xóa trong Python 3.8 để duy trì thứ tự các thuộc tính ban đầu được phân tích cú pháp hoặc tạo bởi mã người dùng.
Nói chung, mã người dùng nên cố gắng không phụ thuộc vào thứ tự thuộc tính cụ thể, vì XML Information Set loại trừ rõ ràng thứ tự thuộc tính khỏi việc truyền tải thông tin. Mã phải được chuẩn bị để xử lý mọi thứ tự đầu vào. Trong trường hợp cần có đầu ra XML xác định, ví dụ: đối với các tập dữ liệu kiểm tra hoặc ký mật mã, việc tuần tự hóa chuẩn có sẵn với chức năng
canonicalize().Trong trường hợp không thể áp dụng đầu ra chuẩn nhưng thứ tự thuộc tính cụ thể vẫn được mong muốn trên đầu ra, mã nên nhằm mục đích tạo các thuộc tính trực tiếp theo thứ tự mong muốn, để tránh cảm giác không khớp đối với người đọc mã. Trong trường hợp khó đạt được điều này, có thể áp dụng công thức như sau trước khi xê-ri hóa để thực thi lệnh độc lập với quá trình tạo Phần tử:
def reorder_attributes(root): cho el trong root.iter(): attrib = el.attrib nếu len(attrib) > 1: Thứ tự thuộc tính # adjust, ví dụ: bằng cách sắp xếp attribs = đã sắp xếp(attrib.items()) attrib.clear() attrib.update(attribs)
Đối tượng ElementTree¶
- class xml.etree.ElementTree.ElementTree(element=None, file=None)¶
Lớp trình bao bọc ElementTree. Lớp này đại diện cho toàn bộ hệ thống phân cấp phần tử và thêm một số hỗ trợ bổ sung cho việc tuần tự hóa đến và từ XML tiêu chuẩn.
element là phần tử gốc. Cây được khởi tạo với nội dung của XML file nếu được cung cấp.
- _setroot(element)¶
Thay thế phần tử gốc cho cây này. Việc này sẽ loại bỏ nội dung hiện tại của cây và thay thế nó bằng phần tử đã cho. Sử dụng cẩn thận. element là một phiên bản phần tử.
- find(match, namespaces=None)¶
Tương tự như
Element.find(), bắt đầu từ gốc cây.
- findall(match, namespaces=None)¶
Tương tự như
Element.findall(), bắt đầu từ gốc cây.
- findtext(match, default=None, namespaces=None)¶
Tương tự như
Element.findtext(), bắt đầu từ gốc cây.
- getroot()¶
Trả về phần tử gốc của cây này.
- iter(tag=None)¶
Tạo và trả về một trình lặp cây cho phần tử gốc. Trình vòng lặp lặp qua tất cả các phần tử trong cây này, theo thứ tự từng phần. tag là thẻ cần tìm (mặc định là trả về tất cả các phần tử).
- iterfind(match, namespaces=None)¶
Tương tự như
Element.iterfind(), bắt đầu từ gốc cây.Added in version 3.2.
- parse(source, parser=None)¶
Tải phần XML bên ngoài vào cây phần tử này. source là tên tệp hoặc file object. parser là một phiên bản trình phân tích cú pháp tùy chọn. Nếu không được cung cấp, trình phân tích cú pháp
XMLParsertiêu chuẩn sẽ được sử dụng. Trả về phần tử gốc của phần.
- write(file, encoding='us-ascii', xml_declaration=None, default_namespace=None, method='xml', *, short_empty_elements=True)¶
Ghi cây phần tử vào một tệp, dưới dạng XML. file là tên tệp hoặc file object được mở để ghi. encoding [1] là mã hóa đầu ra (mặc định là US-ASCII). xml_declaration kiểm soát xem có nên thêm khai báo XML vào tệp hay không. Sử dụng
Falsecho không bao giờ,Truecho luôn luôn,Nonechỉ khi không phải US-ASCII hoặc UTF-8 hoặc Unicode (mặc định làNone). default_namespace đặt không gian tên XML mặc định (cho "xmlns"). method là"xml","html"hoặc"text"(mặc định là"xml"). Tham số short_empty_elements chỉ từ khóa kiểm soát định dạng của các phần tử không chứa nội dung. NếuTrue(mặc định), chúng sẽ được phát ra dưới dạng một thẻ tự đóng duy nhất, nếu không chúng sẽ được phát ra dưới dạng một cặp thẻ bắt đầu/kết thúc.Đầu ra là một chuỗi (
str) hoặc nhị phân (bytes). Điều này được kiểm soát bởi đối số encoding. Nếu encoding là"unicode"thì đầu ra là một chuỗi; mặt khác, nó là nhị phân. Lưu ý rằng điều này có thể xung đột với loại file nếu đó là file object mở; đảm bảo bạn không cố ghi một chuỗi vào luồng nhị phân và ngược lại.Thay đổi trong phiên bản 3.4: Đã thêm tham số short_empty_elements.
Thay đổi trong phiên bản 3.8: Phương thức
write()hiện giữ nguyên thứ tự thuộc tính do người dùng chỉ định.
Đây là tệp XML sẽ được thao tác:
<html>
<đầu>
<title>Trang ví dụ</title>
</head>
<cơ thể>
<p>Đã chuyển đến <a href="http://example.org/">example.org</a>
hoặc <a href="http://example.com/">example.com</a>.</p>
</body>
</html>
Ví dụ về thay đổi thuộc tính "đích" của mọi liên kết trong đoạn đầu tiên:
>>> từ xml.etree.ElementTree nhập ElementTree
>>> cây = ElementTree()
>>> tree.parse("index.xhtml")
<Phần tử 'html' tại 0xb77e6fac>
>>> p = tree.find("body/p") # Finds lần xuất hiện đầu tiên của thẻ p trong nội dung
>>> p
<Phần tử 'p' tại 0xb77ec26c>
>>> links = list(p.iter("a")) # Returns danh sách tất cả các liên kết
>>> liên kết
[<Phần tử 'a' tại 0xb77ec2ac>, <Phần tử 'a' tại 0xb77ec1cc>]
>>> cho i in links: # Iterates qua tất cả các link tìm thấy
... i.attrib["target"] = "blank"
...
>>> tree.write("output.xhtml")
Đối tượng QName¶
- class xml.etree.ElementTree.QName(text_or_uri, tag=None)¶
Trình bao bọc QName. Điều này có thể được sử dụng để bao bọc một giá trị thuộc tính QName, nhằm xử lý không gian tên thích hợp ở đầu ra. text_or_uri là một chuỗi chứa giá trị QName, ở dạng {uri}cục bộ hoặc, nếu đối số thẻ được đưa ra, thì phần URI của QName. Nếu tag được đưa ra, đối số đầu tiên được hiểu là URI và đối số này được hiểu là tên cục bộ. Các phiên bản
QNamekhông rõ ràng.
Đối tượng TreeBuilder¶
- class xml.etree.ElementTree.TreeBuilder(element_factory=None, *, comment_factory=None, pi_factory=None, insert_comments=False, insert_pis=False)¶
Trình xây dựng cấu trúc phần tử chung. Trình xây dựng này chuyển đổi một chuỗi các lệnh gọi phương thức bắt đầu, dữ liệu, kết thúc, nhận xét và pi thành cấu trúc phần tử được định dạng đúng. Bạn có thể sử dụng lớp này để xây dựng cấu trúc phần tử bằng trình phân tích cú pháp XML tùy chỉnh hoặc trình phân tích cú pháp cho một số định dạng giống XML khác.
element_factory, khi được đưa ra, phải là một đối số có thể gọi được, chấp nhận hai đối số vị trí: một thẻ và một mệnh lệnh thuộc tính. Dự kiến sẽ trả về một phiên bản phần tử mới.
Khi được cung cấp, các hàm comment_factory và pi_factory sẽ hoạt động giống như các hàm
Comment()vàProcessingInstruction()để tạo nhận xét và hướng dẫn xử lý. Khi không được cung cấp, các nhà máy mặc định sẽ được sử dụng. Khi insert_comments và/hoặc insert_pis là đúng, các nhận xét/pis sẽ được chèn vào cây nếu chúng xuất hiện bên trong phần tử gốc (nhưng không xuất hiện bên ngoài nó).- close()¶
Xóa bộ đệm của trình tạo và trả về phần tử tài liệu cấp cao nhất. Trả về một phiên bản
Element.
- data(data)¶
Thêm văn bản vào phần tử hiện tại. data là một chuỗi. Đây phải là chuỗi byte hoặc chuỗi Unicode.
- end(tag)¶
Đóng phần tử hiện tại. tag là tên phần tử. Trả về phần tử đã đóng.
- start(tag, attrs)¶
Mở một phần tử mới. tag là tên phần tử. attrs là một từ điển chứa các thuộc tính phần tử. Trả về phần tử đã mở.
- comment(text)¶
Tạo một nhận xét với text đã cho. Nếu
insert_commentslà đúng, điều này cũng sẽ thêm nó vào cây.Added in version 3.8.
- pi(target, text)¶
Tạo một hướng dẫn quy trình với tên target và text đã cho. Nếu
insert_pislà đúng, điều này cũng sẽ thêm nó vào cây.Added in version 3.8.
Ngoài ra, một đối tượng
TreeBuildertùy chỉnh có thể cung cấp các phương thức sau:- doctype(name, pubid, system)¶
Xử lý một khai báo loại tài liệu. name là tên loại tài liệu. pubid là mã định danh công khai. system là mã định danh hệ thống. Phương thức này không tồn tại trên lớp
TreeBuildermặc định.Added in version 3.2.
- start_ns(prefix, uri)¶
Được gọi bất cứ khi nào trình phân tích cú pháp gặp một khai báo không gian tên mới, trước lệnh gọi lại
start()cho phần tử mở xác định nó. prefix là''cho không gian tên mặc định và tên tiền tố không gian tên được khai báo nếu không. uri là không gian tên URI.Added in version 3.8.
- end_ns(prefix)¶
Được gọi sau lệnh gọi lại
end()của một phần tử đã khai báo ánh xạ tiền tố vùng tên, với tên của prefix nằm ngoài phạm vi.Added in version 3.8.
- class xml.etree.ElementTree.C14NWriterTarget(write, *, with_comments=False, strip_text=False, rewrite_prefixes=False, qname_aware_tags=None, qname_aware_attrs=None, exclude_attrs=None, exclude_tags=None)¶
Một nhà văn C14N 2.0. Các đối số giống như đối với hàm
canonicalize(). Lớp này không xây dựng cây mà dịch trực tiếp các sự kiện gọi lại thành dạng tuần tự hóa bằng hàm write.Added in version 3.8.
Đối tượng XMLParser¶
- class xml.etree.ElementTree.XMLParser(*, target=None, encoding=None)¶
Lớp này là khối xây dựng cấp thấp của mô-đun. Nó sử dụng
xml.parsers.expatđể phân tích cú pháp XML dựa trên sự kiện hiệu quả. Nó có thể được cung cấp dữ liệu XML tăng dần bằng phương thứcfeed()và các sự kiện phân tích cú pháp được dịch sang API đẩy - bằng cách gọi lại lệnh gọi lại trên đối tượng target. Nếu target bị bỏ qua thìTreeBuildertiêu chuẩn sẽ được sử dụng. Nếu encoding [1] được cung cấp, giá trị sẽ ghi đè mã hóa được chỉ định trong tệp XML.Thay đổi trong phiên bản 3.8: Các thông số bây giờ là keyword-only. Đối số html không còn được hỗ trợ.
- close()¶
Hoàn tất việc cung cấp dữ liệu cho trình phân tích cú pháp. Trả về kết quả gọi phương thức
close()của target được truyền trong quá trình xây dựng; theo mặc định, đây là thành phần tài liệu cấp cao nhất.
- feed(data)¶
Cung cấp dữ liệu cho trình phân tích cú pháp. data là dữ liệu được mã hóa.
- flush()¶
Kích hoạt phân tích cú pháp của bất kỳ dữ liệu chưa được phân tích cú pháp nào được cung cấp trước đó, có thể được sử dụng để đảm bảo phản hồi ngay lập tức hơn, đặc biệt là với Expat >=2.6.0. Việc triển khai
flush()tạm thời vô hiệu hóa tính năng trì hoãn phân tích lại bằng Expat (nếu hiện được bật) và kích hoạt tính năng phân tích lại. Việc vô hiệu hóa việc trì hoãn phân tích lại có những hậu quả về bảo mật; vui lòng xemxml.parsers.expat.xmlparser.SetReparseDeferralEnabled()để biết chi tiết.Lưu ý rằng
flush()đã được đưa vào một số bản phát hành CPython trước đó như một bản sửa lỗi bảo mật. Kiểm tra tính khả dụng củaflush()bằnghasattr()nếu được sử dụng trong mã chạy trên nhiều phiên bản Python.Added in version 3.13.
XMLParser.feed()gọi phương thứcstart(tag, attrs_dict)của target cho mỗi thẻ mở, phương thứcend(tag)cho mỗi thẻ đóng và dữ liệu được xử lý theo phương thứcdata(data). Để biết thêm các phương thức gọi lại được hỗ trợ, hãy xem lớpTreeBuilder.XMLParser.close()gọi phương thức của target làclose().XMLParsercó thể được sử dụng không chỉ để xây dựng cấu trúc cây. Đây là ví dụ về cách đếm độ sâu tối đa của tệp XML:>>> từ xml.etree.ElementTree nhập XMLParser >>> class MaxDepth: đối tượng đích # The của trình phân tích cú pháp ... maxDepth = 0 ... độ sâu = 0 ... def start(self, tag, attrib): # Called cho mỗi thẻ mở. ... self.độ sâu += 1 ... nếu self.deep > self.maxDepth: ... self.maxDepth = self.deep ... def end(self, tag): # Called cho mỗi thẻ đóng. ... self.độ sâu -= 1 ... dữ liệu def (bản thân, dữ liệu): ... pass # We không cần làm gì với dữ liệu. ... def close(self): # Called khi tất cả dữ liệu đã được phân tích cú pháp. ... trả về self.maxDepth ... >>> mục tiêu = MaxDepth() >>> trình phân tích cú pháp = XMLParser(target=target) >>> ví dụXml = """ ... <a> ... <b> ... </b> ... <b> ... <c> ... <d> ... </d> ... </c> ... </b> ... </a>""" >>> trình phân tích cú pháp.feed(exampleXml) >>> trình phân tích cú pháp.close() 4
Đối tượng XMLPullParser¶
- class xml.etree.ElementTree.XMLPullParser(events=None)¶
Trình phân tích cú pháp kéo phù hợp cho các ứng dụng không chặn. API phía đầu vào của nó tương tự như
XMLParser, nhưng thay vì đẩy các cuộc gọi đến mục tiêu gọi lại,XMLPullParserthu thập danh sách nội bộ các sự kiện phân tích cú pháp và cho phép người dùng đọc từ đó. events là một chuỗi các sự kiện cần báo cáo lại. Các sự kiện được hỗ trợ là các chuỗi"start","end","comment","pi","start-ns"và"end-ns"(các sự kiện "ns" được sử dụng để lấy thông tin chi tiết về không gian tên). Nếu events bị bỏ qua, chỉ các sự kiện"end"được báo cáo.- feed(data)¶
Cung cấp dữ liệu byte đã cho cho trình phân tích cú pháp.
- flush()¶
Kích hoạt phân tích cú pháp của bất kỳ dữ liệu chưa được phân tích cú pháp nào được cung cấp trước đó, có thể được sử dụng để đảm bảo phản hồi ngay lập tức hơn, đặc biệt là với Expat >=2.6.0. Việc triển khai
flush()tạm thời vô hiệu hóa tính năng trì hoãn phân tích lại bằng Expat (nếu hiện được bật) và kích hoạt tính năng phân tích lại. Việc vô hiệu hóa việc trì hoãn phân tích lại có những hậu quả về bảo mật; vui lòng xemxml.parsers.expat.xmlparser.SetReparseDeferralEnabled()để biết chi tiết.Lưu ý rằng
flush()đã được đưa vào một số bản phát hành CPython trước đó như một bản sửa lỗi bảo mật. Kiểm tra tính khả dụng củaflush()bằnghasattr()nếu được sử dụng trong mã chạy trên nhiều phiên bản Python.Added in version 3.13.
- close()¶
Báo hiệu cho bộ phân tích cú pháp rằng luồng dữ liệu đã kết thúc. Không giống như
XMLParser.close(), phương thức này luôn trả vềNone. Bất kỳ sự kiện nào chưa được truy xuất khi đóng trình phân tích cú pháp vẫn có thể được đọc bằngread_events().
- read_events()¶
Trả về một trình lặp về các sự kiện đã gặp trong dữ liệu được cung cấp cho trình phân tích cú pháp. Trình vòng lặp tạo ra các cặp
(event, elem), trong đó event là một chuỗi biểu thị loại sự kiện (ví dụ:"end") và elem là đối tượngElementgặp phải hoặc giá trị ngữ cảnh khác như sau.start,end: Phần tử hiện tại.comment,pi: hướng dẫn xử lý/nhận xét hiện tạistart-ns: một bộ(prefix, uri)đặt tên cho ánh xạ không gian tên được khai báo.end-ns:None(điều này có thể thay đổi trong phiên bản tương lai)
Các sự kiện được cung cấp trong lệnh gọi
read_events()trước đó sẽ không được thực hiện lại. Các sự kiện chỉ được sử dụng từ hàng đợi nội bộ khi chúng được truy xuất từ trình vòng lặp, do đó, nhiều trình đọc lặp song song trên các trình vòng lặp thu được từread_events()sẽ có kết quả không thể đoán trước.
Ghi chú
XMLPullParserchỉ đảm bảo rằng nó đã nhìn thấy ký tự ">" của thẻ bắt đầu khi nó phát ra sự kiện "bắt đầu", do đó các thuộc tính được xác định, nhưng nội dung của thuộc tính văn bản và đuôi không được xác định tại thời điểm đó. Điều tương tự cũng áp dụng cho phần tử con; họ có thể có mặt hoặc không.Nếu bạn cần một phần tử được điền đầy đủ, thay vào đó hãy tìm các sự kiện "kết thúc".
Added in version 3.4.
Thay đổi trong phiên bản 3.8: Các sự kiện
commentvàpiđã được thêm vào.
Ngoại lệ¶
- class xml.etree.ElementTree.ParseError¶
lỗi phân tích cú pháp XML, xảy ra do các phương pháp phân tích cú pháp khác nhau trong mô-đun này khi phân tích cú pháp không thành công. Biểu diễn chuỗi của một phiên bản của ngoại lệ này sẽ chứa thông báo lỗi thân thiện với người dùng. Ngoài ra, nó sẽ có sẵn các thuộc tính sau:
- code¶
Mã lỗi số từ trình phân tích cú pháp của người nước ngoài. Xem tài liệu của
xml.parsers.expatđể biết danh sách mã lỗi và ý nghĩa của chúng.
- position¶
Một bộ số line, column, chỉ định nơi xảy ra lỗi.
Chú thích cuối trang