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.
Nota
Se você precisar analisar dados não confiáveis ou não autenticados, consulte Segurança no 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 das seguintes constantes, e node é o nó ao qual o evento se refere. Os nós implementam as interfaces xml.dom; eles são criados pela implementação do DOM fornecida a PullDOM, que é xml.dom.minidom por padrão.
- xml.dom.pulldom.START_DOCUMENT¶
- xml.dom.pulldom.END_DOCUMENT¶
O início e o fim do documento. node é o
Document.
- xml.dom.pulldom.START_ELEMENT¶
- xml.dom.pulldom.END_ELEMENT¶
A tag de início e a tag de fim de um elemento. node é o
Element.
- xml.dom.pulldom.IGNORABLE_WHITESPACE¶
Espaço em branco no conteúdo do elemento, conforme declarado na DTD. node é o nó
Text.
- xml.dom.pulldom.PROCESSING_INSTRUCTION¶
Uma instrução de processamento. node é o nó
ProcessingInstruction.
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.ContentHandlerque converte eventos SAX em eventos do pull parser. Os nós são criados, mas não são adicionados à árvore, a menos queexpandNode()seja chamado. documentFactory, se fornecido, é uma implementação DOM usada para criar o documento; por padrão, utiliza-se a implementação dexml.dom.minidom.
- class xml.dom.pulldom.SAX2DOM(documentFactory=None)¶
Subclasse de
PullDOMque também adiciona cada nó criado à árvore, de modo que o documento completo seja construído.
- 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. A string deve ser uma instância destr; para analisar bytes, passe um objeto arquivo binário paraparse().
- 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)¶
Produz os eventos para os dados lidos do objeto arquivo stream pelo parser
XMLReader. Os dados são lidos em blocos de bufsize bytes — ou caracteres, no caso de um fluxo de texto — por vez.Alterado na versão 3.11: O suporte para o método
__getitem__()foi removido- getEvent()¶
Retorna a próxima tupla
(event, node)ouNoneao final do documento. Consulte acima as informações sobre os eventos e os nós correspondentes. 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()¶
Descarta os eventos que ainda não foram lidos e prepare o objeto para análise de um novo documento.
- clear()¶
Libera o analisador e o documento. O fluxo não é fechado, e o objeto não pode mais ser utilizado.