xml.dom.pulldom --- Hỗ trợ xây dựng cây DOM một phần

Source code: Lib/xml/dom/pulldom.py


Mô-đun xml.dom.pulldom cung cấp một "trình phân tích cú pháp kéo" cũng có thể được yêu cầu tạo ra các đoạn tài liệu có thể truy cập DOM khi cần thiết. Khái niệm cơ bản liên quan đến việc lấy "sự kiện" từ luồng XML đến và xử lý chúng. Ngược lại với SAX cũng sử dụng mô hình xử lý theo hướng sự kiện cùng với các lệnh gọi lại, người dùng trình phân tích cú pháp kéo chịu trách nhiệm kéo các sự kiện khỏi luồng một cách rõ ràng, lặp lại các sự kiện đó cho đến khi quá trình xử lý kết thúc hoặc xảy ra tình trạng lỗi.

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.

Thay đổi trong phiên bản 3.7.1: Trình phân tích cú pháp SAX không còn xử lý các thực thể bên ngoài chung theo mặc định để tăng tính bảo mật theo mặc định. Để cho phép xử lý các thực thể bên ngoài, hãy chuyển một phiên bản trình phân tích cú pháp tùy chỉnh vào:

từ phân tích nhập khẩu xml.dom.pulldom
từ xml.sax nhập make_parser
từ nhập xml.sax.handler feature_external_ges

trình phân tích  pháp = make_parser()
parser.setFeature(feature_external_ges, True)
phân tích  pháp (tên tệp, trình phân tích  pháp = trình phân tích  pháp)

Ví dụ:

từ pulldom nhập xml.dom

doc = pulldom.parse('sale_items.xml')
cho sự kiện, nút trong tài liệu:
    nếu sự kiện == pulldom.START_ELEMENT  node.tagName == 'item':
        nếu int(node.getAttribution('price')) > 50:
            doc.expandNode(nút)
            in(node.toxml())

event là một hằng số và có thể là một trong:

  • START_ELEMENT

  • END_ELEMENT

  • COMMENT

  • START_DOCUMENT

  • END_DOCUMENT

  • CHARACTERS

  • PROCESSING_INSTRUCTION

  • IGNORABLE_WHITESPACE

node là đối tượng thuộc loại xml.dom.minidom.Document, xml.dom.minidom.Element hoặc xml.dom.minidom.Text.

Vì tài liệu được coi là một luồng sự kiện "phẳng", "cây" tài liệu được duyệt ngầm và các phần tử mong muốn được tìm thấy bất kể độ sâu của chúng trong cây. Nói cách khác, người ta không cần phải xem xét các vấn đề phân cấp như tìm kiếm đệ quy các nút tài liệu, mặc dù nếu bối cảnh của các phần tử là quan trọng thì người ta sẽ cần duy trì một số trạng thái liên quan đến ngữ cảnh (tức là ghi nhớ vị trí của một phần tử trong tài liệu tại bất kỳ điểm nào) hoặc sử dụng phương thức DOMEventStream.expandNode() và chuyển sang xử lý liên quan đến DOM.

class xml.dom.pulldom.PullDOM(documentFactory=None)

Lớp con của xml.sax.handler.ContentHandler.

class xml.dom.pulldom.SAX2DOM(documentFactory=None)

Lớp con của xml.sax.handler.ContentHandler.

xml.dom.pulldom.parse(stream_or_string, parser=None, bufsize=None)

Trả về DOMEventStream từ đầu vào đã cho. stream_or_string có thể là tên tệp hoặc đối tượng giống như tệp. parser, nếu được cung cấp, phải là đối tượng XMLReader. Hàm này sẽ thay đổi trình xử lý tài liệu của trình phân tích cú pháp và kích hoạt hỗ trợ không gian tên; cấu hình trình phân tích cú pháp khác (như đặt trình phân giải thực thể) phải được thực hiện trước.

Nếu bạn có XML trong một chuỗi, bạn có thể sử dụng hàm parseString() thay thế:

xml.dom.pulldom.parseString(string, parser=None)

Trả về DOMEventStream đại diện cho string (Unicode).

xml.dom.pulldom.default_bufsize

Giá trị mặc định cho tham số bufsizeparse().

Giá trị của biến này có thể được thay đổi trước khi gọi parse() và giá trị mới sẽ có hiệu lực.

Đối tượng DOMEventStream

class xml.dom.pulldom.DOMEventStream(stream, parser, bufsize)

Thay đổi trong phiên bản 3.11: Hỗ trợ cho phương pháp __getitem__() đã bị xóa.

getEvent()

Trả về một bộ chứa eventnode hiện tại là xml.dom.minidom.Document nếu sự kiện bằng START_DOCUMENT, xml.dom.minidom.Element nếu sự kiện bằng START_ELEMENT hoặc END_ELEMENT hoặc xml.dom.minidom.Text nếu sự kiện bằng CHARACTERS. Nút hiện tại không chứa thông tin về nút con của nó, trừ khi expandNode() được gọi.

expandNode(node)

Mở rộng tất cả các phần tử con của node thành node. Ví dụ:

từ pulldom nhập xml.dom

xml = '<html><title>Foo</title> <p>Một số văn bản <div>và hơn thế nữa</div></p> </html>'
doc = pulldom.parseString(xml)
cho sự kiện, nút trong tài liệu:
    nếu sự kiện == pulldom.START_ELEMENT  node.tagName == 'p':
        Câu lệnh # Following chỉ in '<p/>'
        in(node.toxml())
        doc.expandNode(nút)
        Câu lệnh # Following in nút với tất cả các nút con của nó '<p>Một số văn bản <div>và hơn thế nữa</div></p>'
        in(node.toxml())
reset()