0

XML (ツリー形式) があり、そこからサブツリーを作成する必要があります。

例:

<a>
  <b>
    <c>Hello</c>
  <d>
    <e>Hi</e>
</a>

サブツリーは

<root>
<a>
  <b>
    <c>Hello</c>
   </b>
</a>
<a>
  <d>
     <e>Hi</e>
  </d>
</a>
</root>

Pythonでそれを行うのに最適なXMLライブラリは何ですか? すでにこれを行っているアルゴリズムも役に立ちます。注: XML ドキュメントはそれほど大きくなく、簡単にメモリに収まります。

4

1 に答える 1

4

ElementTreeは、「読み取り」と「書き込み」の両方に適したシンプルなものです。

最初のXMLの例(読みやすいようにフォーマットを追加するためだけに質問を編集しました!)は無効です。 「サブツリー」と呼ばれるもの(私にはサブツリーのようには見えません)のクローズタグが欠落しているbと思います。 d、ただし、最初のフォームの書き直しとして意図されているように見えます)。

「きれいさ」の問題を除いて(たとえば、結果のXMLをきれいに見せるために改行とインデントを追加する;-)、私があなたを正しく理解していれば、このコードはあなたが求めていることを実行するはずです:

try:
  import xml.etree.cElementTree as et
  import cStringIO as sio
except ImportError:
  import xml.etree.ElementTree as et
  import StringIO as sio

xmlin = sio.StringIO('''<a>
  <b>
    <c>Hello</c>
  </b>
  <d>
    <e>Hi</e>
  </d>
</a>
''')

tin = et.parse(xmlin)
top = tin.getroot()
tou = et.ElementTree(et.Element('root'))
newtop = tou.getroot()
for child in top.getchildren():
  subtree = et.Element(top.tag)
  subtree.append(child)
  newtop.append(subtree)

import sys
tou.write(sys.stdout)

最初のtry/exceptは、利用可能な「通常の」プラットフォームでモジュールのCバージョンを使用しようとしますが、それ以外の場合は純粋なPythonモジュールにフォールバックします(App Engine、Jython、IronPythonなど)。

次にtin、指定されたXML文字列から2つのツリー(入力ツリー)を作成します。tou、出力のもの。ルート要素を除いて、最初は空です。

残りはすべて、tinルートのすべてのサブ要素に対する非常に単純なループです。それぞれについて、適切なサブツリーが構築され、ルートのサブ要素に追加されtouます。これですべてです。

最後の2行は、結果のツリーを示しています(空白の問題のため、きれいではありませんが、XML構造に関しては完全に正しいです;-)。

于 2010-03-10T04:24:44.357 に答える