Pythonのxml.etreeを使用して要素の開始文字と終了文字のオフセットを検索する

私は次のようなXMLデータを持っています:


The captial of South Africa is Pretoria.

私は以下を抽出することができます:

  1. 現在のetreeで提供されているXML要素。
  2. 開始タグと終了タグの間のドキュメントの完全なプレーンテキスト。
  3. 各開始要素のプレーンテキスト内の位置を文字オフセットとして指定します。

(3)は現在最も重要な要件です。 etreeは(1)罰金を提供します。

私は直接(3)を行う方法は見当たりませんが、ドキュメントツリーの要素を反復することで、(2)と(3)を提供するように再組み立て可能な小さな文字列が返されることを期待しました。しかしながら、ルートノードの.textを要求することは、ルートノードと最初の要素との間のテキストのみを返す。
“の首都 “。

SAXを使って(1)を行うには、すでに何回も書かれたたくさんのものを実装する必要があります。 minidomとetree。
lxmlの使用は、このコードが入るパッケージのオプションではありません。誰でも助けることができますか?

ベストアンサー

iterparse() function is available in
xml.etree:

import xml.etree.cElementTree as etree

for event, elem in etree.iterparse(file, events=('start', 'end')):
    if event == 'start':
       print(elem.tag) # use only tag name and attributes here
    elif event == 'end':
       # elem children elements, elem.text, elem.tail are available
       if elem.text is not None and elem.tail is not None:
          print(repr(elem.tail))

もう一つの選択肢は、 etree.TreeBuilder()
start()data()end()
>:

from xml.etree.ElementTree import XMLParser, TreeBuilder

class MyTreeBuilder(TreeBuilder):

    def start(self, tag, attrs):
        print("<%s>" % tag)
        return TreeBuilder.start(self, tag, attrs)

    def data(self, data):
        print(repr(data))
        TreeBuilder.data(self, data)

    def end(self, tag):
        return TreeBuilder.end(self, tag)

text = """
The captial of South Africa is Pretoria.
"""

# ElementTree.fromstring()
parser = XMLParser(target=MyTreeBuilder())
parser.feed(text)
root = parser.close() # return an ordinary Element

出力


'nThe captial of '

'South Africa'
' is '

'Pretoria'
'.n'

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です