Làm việc với XML trong Python (tiếp tục)
Bạn có thể nhập khẩu class ElementTree trực tiếp từ thư viện tiêu chuẩn. Bạn cũng đang tạo alias ET đơn giản hơn
để bạn có thể dễ dàng tham chiếu đến nó trong các ví dụ sau:
>>> import xml.etree.ElementTree as ET
Có một vài cách thức để nhập khẩu một tài liệu XML, như với ET.parse(), cái load từ một file trên hệ thống file.
Tuy nhiên, bạn cũng có thể load XML từ một biến string, cái bạn có thể có nếu bạn nhìn vào một trả lời đối với một
API request. Trong ví dụ tiếp theo, bạn đang khai báo biến data của bản thân bạn và sau đó sử dụng phương thức
ET.fromstring() để đọc string này và tạo một cây phần tử mới từ nó:
data = “””
<devices><device name=”sw01″>
<vendor>Cisco</vendor>
<model>Nexus 7700</model>
<osver>NXOS 6.1</osver></device>
<device name=”sw02″>
<vendor>Arista</vendor>
<model>Arista 7800</model>
<osver>EOS 4.27</osver></device>
<device name=”sw03″>
<vendor>Juniper</vendor>
<model>QFX 10008</model>
<osver>Junos 21.3</osver></device>
</devices>
“””
tree = ET.fromstring(data)
Bạn đơn giản có thể in ra giá trị của biến tree mới của bạn để xem cái gì đã được tạo cho bạn:
>>> print(tree)
<Element ‘devices’ at 0x7f953cc8e1d0>
Bạn sẽ nhận thấy rằng dạng cho biến này là Element. Cái này không trình bày đầy đủ toàn bộ tree, mà chỉ phần tử root
, cái là tag cực ngoài trong tài liệu XML <device>. Phần tử này sẽ có các tham chiếu tới các con của nó cái bạn có
thể truy cập, và những cái đó sẽ có các con của bản thân chúng.vv…
Cách thức chính để truy cập các con cho một Element đã cho là qua lặp. Bạn có thể tạo một for loop để lặp trên phần
tử này, và các vật cung cấp tại mỗi lần lặp sẽ là một trong những các con của phần tử đó:
>>> for device in tree:
… print(f”Device {device} found!”)
…
Device <Element ‘device’ at 0x7f953cc3c590> found!
Device <Element ‘device’ at 0x7f953cbeb6d0> found!
Device <Element ‘device’ at 0x7f953cbeb860> found!
Tất nhiên, cái này không thông báo cho bạn nhiều về mỗi device, chỉ rằng có ba số chúng. Để truy cập thông tin nhiều
hơn, bạn phải đi sâu hơn một chút, vì các phần tử như model và vendor là các phần tử con của các phần tử device.
Bạn có thể sử dụng phương thức find() để tìm kiếm bên trong các con của một node đã cho và tìm ra cái đầu tiên cái
khớp với một tag đã cho:
>>> for device in tree:
… model = device.find(‘model’).text
… print(f”Device model is {model}”)
…
Device model is Nexus 7700
Device model is Arista 7800
Device model is QFX 10008
Vì bạn đã đang lặp qua các con của tree để nhận các phần tử device, phương thức find() có thể được sử dụng trực tiếp
trên một phần tử device để tìm kiếm các con của nó.