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 ettXMLReader
-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 medSTART_DOCUMENT
,xml.dom.minidom.Element
om event är lika medSTART_ELEMENT
ellerEND_ELEMENT
ellerxml.dom.minidom.Text
om event är lika medCHARACTERS
. Den aktuella noden innehåller inte information om sina barn, såvida inteexpandNode()
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()¶