xml.dom.pulldom — Stöd för att bygga partiella DOM-träd

Källkod: Lib/xml/dom/pulldom.py


Modulen xml.dom.pulldom tillhandahåller en ”pull-parser” som också kan ombes att producera DOM-åtkomliga fragment av dokumentet vid behov. Grundkonceptet innebär att ”händelser” hämtas från en ström av inkommande XML och bearbetas. Till skillnad från SAX, som också använder en händelsestyrd bearbetningsmodell tillsammans med callbacks, är användaren av en pull-parser ansvarig för att uttryckligen hämta händelser från strömmen och loopa över dessa händelser tills antingen bearbetningen är klar eller ett feltillstånd uppstår.

Anteckning

Om du behöver analysera otillförlitliga eller oautentiserade data, se XML-säkerhet.

Ändrad i version 3.7.1: SAX-parsern bearbetar inte längre allmänna externa enheter som standard för att öka säkerheten som standard. För att aktivera behandling av externa enheter, skicka en anpassad parser-instans i:

from xml.dom.pulldom import parse
from xml.sax import make_parser
from xml.sax.handler import feature_external_ges

parser = make_parser()
parser.setFeature(feature_external_ges, True)
parse(filename, parser=parser)

Exempel:

från xml.dom import pulldom

doc = pulldom.parse('försäljning_items.xml')
för event, nod i doc:
    if event == pulldom.START_ELEMENT och node.tagName == 'item':
        if int(node.getAttribute('price')) > 50:
            doc.expandNode(node)
            print(node.toxml())

event är en konstant och kan vara en av:

  • START_ELEMENT

  • END_ELEMENT

  • KOMMENTAR

  • START_DOKUMENT

  • END_DOCUMENT

  • CHARACTERS

  • PROCESSING_INSTRUCTION

  • IGNORABLE_WHITESPACE

node är ett objekt av typen xml.dom.minidom.Document, xml.dom.minidom.Element eller xml.dom.minidom.Text.

Eftersom dokumentet behandlas som en ”platt” ström av händelser, genomkorsas dokumentets ”träd” implicit och de önskade elementen hittas oavsett djup i trädet. Med andra ord behöver man inte ta hänsyn till hierarkiska frågor som rekursiv sökning i dokumentets noder, men om elementens sammanhang var viktigt skulle man antingen behöva upprätthålla ett sammanhangsrelaterat tillstånd (dvs. komma ihåg var man befinner sig i dokumentet vid en viss tidpunkt) eller använda DOMEventStream.expandNode()-metoden och övergå till DOM-relaterad bearbetning.

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

Underklass till xml.sax.handler.ContentHandler.

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

Underklass till xml.sax.handler.ContentHandler.

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

Returnerar en DOMEventStream från den givna indata. stream_or_string kan vara antingen ett filnamn eller ett filliknande objekt. parser, om det anges, måste vara ett XMLReader-objekt. Denna funktion ändrar dokumenthanteraren för parsern och aktiverar stöd för namnrymder; annan parserkonfiguration (som att ställa in en entitetsresolver) måste ha gjorts i förväg.

Om du har XML i en sträng kan du använda funktionen parseString() istället:

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

Returnerar en DOMEventStream som representerar (Unicode) strängen.

xml.dom.pulldom.default_bufsize

Standardvärde för parametern bufsize i parse().

Värdet på denna variabel kan ändras innan parse() anropas och det nya värdet träder i kraft.

DOMEventStream-objekt

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

Ändrad i version 3.11: Stöd för metoden __getitem__() har tagits bort.

getEvent()

Returnerar en tupel innehållande event och den aktuella noden som xml.dom.minidom.Document om event är lika med START_DOCUMENT, xml.dom.minidom.Element om event är lika med START_ELEMENT eller END_ELEMENT eller xml.dom.minidom.Text om event är lika med CHARACTERS. Den aktuella noden innehåller inte information om sina barn, såvida inte expandNode() anropas.

expandNode(node)

Expanderar alla barn till node till node. Exempel:

från xml.dom import pulldom

xml = '<html><title>Foo</title> <p>Lite text och <div>mer</div></p> </html>'
doc = pulldom.parseString(xml)
för händelse, nod i doc:
    if event == pulldom.START_ELEMENT och node.tagName == 'p':
        # Följande sats skriver bara ut '<p/>'
        print(node.toxml())
        doc.expandNode(nod)
        # Följande sats skriver ut noden med alla dess barn '<p>Lite text och <div>mer</div></p>'
        print(node.toxml())
reset()