2011-12-20 28 views
19

Tôi có một chuỗi chứa dữ liệu XML được trả về từ một yêu cầu http.Python ElementTree: Phân tích cú pháp một chuỗi và nhận cá thể ElementTree

Tôi đang sử dụng ElementTree để phân tích dữ liệu và sau đó tôi muốn tìm kiếm đệ quy cho một phần tử.

Theo this question, tôi chỉ có thể tìm kiếm đệ quy với result.findall() nếu result thuộc loại ElementTree thay vì loại Element.

Bây giờ xml.etree.ElementTree.fromstring(), được sử dụng để phân tích chuỗi, trả về một đối tượng Element, trong khi xml.etree.ElementTree.parse(), được sử dụng để phân tích một file , trả về một đối tượng ElementTree.

Câu hỏi của tôi là: Làm cách nào để phân tích chuỗi và nhận được phiên bản ElementTree? (không có bất kỳ sự điên rồ nào như ghi vào một tệp tạm thời)

Trả lời

25

Khi bạn sử dụng ElementTree.fromstring() những gì bạn đang quay lại về cơ bản là gốc cây, vì vậy nếu bạn tạo cây mới như thế này ElementTree.ElementTree(root) bạn sẽ nhận được bạn ' Đang tìm kiếm.

Vì vậy, để làm cho nó rõ ràng hơn:

from xml.etree import ElementTree 
tree = ElementTree.ElementTree(ElementTree.fromstring(<your_xml_string>)) 

hay:

from xml.etree.ElementTree import fromstring, ElementTree 
tree = ElementTree(fromstring(<your_xml_string>)) 
+0

Tôi chỉ muốn add - cho những người sử dụng lxml - trong lxml (trong đó một phần tử luôn thuộc về một tài liệu/cây, ngay cả khi ẩn), bạn có thể sử dụng phương thức getrootttree(). – Steven

+0

Cảm ơn! Thiết kế API thực sự khó chịu trong etree, để có các loại đầu ra khác nhau chỉ phụ thuộc vào nguồn vào. Thực sự khó hiểu: ( –

+0

Điều này thực sự không rõ ràng trong tài liệu. "Fromstring() phân tích cú pháp XML từ một chuỗi trực tiếp thành một phần tử, 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 một ElementTree." – Snorfalorpagus

6

Rẽ chuỗi của bạn thành một đối tượng tập tin giống như và sử dụng ElementTree.parse:

from xml.etree import ElementTree 
from cStringIO import StringIO 

tree = ElementTree.parse(StringIO(string)) 
+0

Tuyệt, đây là cái tôi đang tìm kiếm .--) –

Các vấn đề liên quan