xml.dom.pulldom — Suporte para construir árvores parciais de DOM¶
Código-fonte: Lib/xml/dom/pulldom.py
O módulo xml.dom.pulldom fornece um “analisador sintático de pull” que também pode ser solicitado a produzir fragmentos do documento acessíveis via DOM, quando necessário. O conceito básico envolve extrair “eventos” de um fluxo de XML recebido e processá-los. Ao contrário do SAX, que também emprega um modelo de processamento orientado a eventos juntamente com retornos de chamada, o usuário de um analisador sintático pull é responsável por extrair explicitamente os eventos do fluxo, repetindo esses eventos até que o processamento seja concluído ou ocorra uma condição de erro.
Aviso
The xml.dom.pulldom module is not secure against
maliciously constructed data. If you need to parse untrusted or
unauthenticated data see Vulnerabilidades em XML.
Alterado na versão 3.7.1: O analisador sintático de SAX não processa mais entidades externas gerais por padrão para aumentar a segurança. Para habilitar o processamento de entidades externas, passe uma instância personalizada do analisador sintático em:
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)
Exemplo:
from xml.dom import pulldom
doc = pulldom.parse('sales_items.xml')
for event, node in doc:
if event == pulldom.START_ELEMENT and node.tagName == 'item':
if int(node.getAttribute('price')) > 50:
doc.expandNode(node)
print(node.toxml())
event é uma constante e pode ser um de:
START_ELEMENTEND_ELEMENTCOMMENTSTART_DOCUMENTEND_DOCUMENTCHARACTERSPROCESSING_INSTRUCTIONIGNORABLE_WHITESPACE
node é um objeto do tipo xml.dom.minidom.Document, xml.dom.minidom.Element ou xml.dom.minidom.Text.
Como o documento é tratado como um fluxo “plano” de eventos, a “árvore” do documento é implicitamente percorrida e os elementos desejados são encontrados independentemente de sua profundidade na árvore. Em outras palavras, não é necessário considerar questões hierárquicas, como a busca recursiva dos nós do documento, embora, se o contexto dos elementos fosse importante, seria necessário manter algum estado relacionado ao contexto (ou seja, lembrar onde se está no documento em um determinado ponto) ou utilizar o método DOMEventStream.expandNode() e alternar para o processamento relacionado ao DOM.
- class xml.dom.pulldom.PullDom(documentFactory=None)¶
Subclasse de
xml.sax.handler.ContentHandler.
- class xml.dom.pulldom.SAX2DOM(documentFactory=None)¶
Subclasse de
xml.sax.handler.ContentHandler.
- xml.dom.pulldom.parse(stream_or_string, parser=None, bufsize=None)¶
Retorna um
DOMEventStreamda entrada fornecida. stream_or_string pode ser um nome de arquivo ou um objeto arquivo ou similar. parser, se fornecido, deve ser um objetoXMLReader. Esta função alterará o manipulador de documentos do analisador e ativará o suporte a espaços de nomes; outras configurações do analisador sintático (como a definição de um resolvedor de entidades) devem ter sido feitas previamente.
Se você tiver XML em uma string, poderá usar a função parseString():
- xml.dom.pulldom.parseString(string, parser=None)¶
Retorna um
DOMEventStreamque representa a string (Unicode).
- xml.dom.pulldom.default_bufsize¶
Valor padrão para o parâmetro bufsize para
parse().O valor desta variável pode ser alterado antes de chamar
parse()e o novo valor entrará em vigor.
Objetos DOMEventStream¶
- class xml.dom.pulldom.DOMEventStream(stream, parser, bufsize)¶
Alterado na versão 3.11: O suporte para o método
__getitem__()foi removido- getEvent()¶
Retorna uma tupla contendo evento event e o nó node atual como
xml.dom.minidom.Documentse o evento for igual aSTART_DOCUMENT,xml.dom.minidom.Elementse o evento for igual aSTART_ELEMENTouEND_ELEMENTouxml.dom.minidom.Textse o evento for igual aCHARACTERS. O nó atual não contém informações sobre seus filhos, a menos queexpandNode()seja chamado.
- expandNode(node)¶
Expande todos os filhos de node para node. Exemplo:
from xml.dom import pulldom xml = '<html><title>Foo</title> <p>Algum texto <div>e mais</div></p> </html>' doc = pulldom.parseString(xml) for event, node in doc: if event == pulldom.START_ELEMENT and node.tagName == 'p': # A seguinte instrução só exibe '<p/>' print(node.toxml()) doc.expandNode(node) # A seguinte instrução exibe o nó com todos os seus filhos '<p>Algum texto <div>e mais</div></p>' print(node.toxml())
- reset()¶