xml.dom.pulldom —部分的なDOMツリーの構築のサポート—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/3.8/library/xml.dom.pulldom
移動先:案内検索

xml.dom.pulldom —部分的なDOMツリーの構築のサポート

ソースコード: :source: `Lib / xml / dom / pulldom.py`



xml.dom.pulldom モジュールは、必要に応じてドキュメントのDOMアクセス可能なフラグメントを生成するように要求できる「プルパーサー」を提供します。 基本的な概念には、着信XMLのストリームから「イベント」を取得して処理することが含まれます。 コールバックとともにイベント駆動型処理モデルも採用しているSAXとは対照的に、プルパーサーのユーザーは、ストリームからイベントを明示的にプルし、処理が終了するかエラー状態が発生するまでそれらのイベントをループします。

警告

xml.dom.pulldom モジュールは、悪意を持って構築されたデータに対して安全ではありません。 信頼できないデータまたは認証されていないデータを解析する必要がある場合は、 XMLの脆弱性を参照してください。


バージョン3.7.1で変更: SAXパーサーは、デフォルトでセキュリティを強化するために、デフォルトで一般的な外部エンティティを処理しなくなりました。 外部エンティティの処理を有効にするには、カスタムパーサーインスタンスを次の場所に渡します。

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)

例:

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は定数であり、次のいずれかになります。

  • START_ELEMENT
  • END_ELEMENT
  • COMMENT
  • START_DOCUMENT
  • END_DOCUMENT
  • CHARACTERS
  • PROCESSING_INSTRUCTION
  • IGNORABLE_WHITESPACE

nodeは、タイプxml.dom.minidom.Documentxml.dom.minidom.Element、またはxml.dom.minidom.Textのオブジェクトです。

ドキュメントはイベントの「フラット」ストリームとして扱われるため、ドキュメントの「ツリー」は暗黙的にトラバースされ、ツリー内の深さに関係なく、目的の要素が見つかります。 言い換えると、ドキュメントノードの再帰的検索などの階層的な問題を考慮する必要はありませんが、要素のコンテキストが重要である場合は、コンテキスト関連の状態を維持する必要があります(つまり、 任意の時点でドキュメント内のどこにあるかを覚えておく)、または DOMEventStream.expandNode()メソッドを使用して、DOM関連の処理に切り替えます。

class xml.dom.pulldom.PullDom(documentFactory=None)
xml.sax.handler.ContentHandler のサブクラス。
class xml.dom.pulldom.SAX2DOM(documentFactory=None)
xml.sax.handler.ContentHandler のサブクラス。
xml.dom.pulldom.parse(stream_or_string, parser=None, bufsize=None)
指定された入力から DOMEventStream を返します。 stream_or_string は、ファイル名またはファイルのようなオブジェクトのいずれかです。 parser は、指定されている場合、 XMLReader オブジェクトである必要があります。 この関数は、パーサーのドキュメントハンドラーを変更し、名前空間のサポートをアクティブにします。 他のパーサー構成(エンティティリゾルバーの設定など)は、事前に行っておく必要があります。

文字列にXMLがある場合は、代わりに parseString()関数を使用できます。

xml.dom.pulldom.parseString(string, parser=None)
(Unicode) string を表す DOMEventStream を返します。
xml.dom.pulldom.default_bufsize

bufsize パラメーターのデフォルト値は parse()です。

この変数の値は、 parse()を呼び出す前に変更でき、新しい値が有効になります。

DOMEventStreamオブジェクト

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

バージョン3.8以降非推奨: sequence protocolのサポートは非推奨になりました。

getEvent()

event と現在の node を含むタプルをxml.dom.minidom.Documentとして返します(イベントがSTART_DOCUMENTに等しい場合)、xml.dom.minidom.Element(イベントがSTART_ELEMENTまたはEND_ELEMENTまたはxml.dom.minidom.TextexpandNode()が呼び出されない限り、現在のノードにはその子に関する情報は含まれません。

expandNode(node)

node のすべての子を node に展開します。 例:

from xml.dom import pulldom

xml = '<html><title>Foo</title> <p>Some text <div>and more</div></p> </html>'
doc = pulldom.parseString(xml)
for event, node in doc:
    if event == pulldom.START_ELEMENT and node.tagName == 'p':
        # Following statement only prints '<p/>'
        print(node.toxml())
        doc.expandNode(node)
        # Following statement prints node with all its children '<p>Some text <div>and more</div></p>'
        print(node.toxml())
reset()