7

lxml (または組み込みの etree ライブラリ) を使用して、xml のフラグメントを表すが、2 つ (またはそれ以上) の分離したツリー (つまり、各ツリーには独自のルートがありますが、共通の祖先を共有しない) を含むオブジェクトを作成できますか?

つまり、両方を保持する別の要素を作成せずに、以下を表すことができるものはありますか?

<tree id="A"><anotherelement/></tree>
<tree id="B"><yetanotherelement/></tree>

それを可能にするlxmlドキュメントには何も表示されず、stackoverflowには直接的なものはないようです。

ここでの使用例は、プログラムで xml を生成し、フラグメントが出力用に 1 つのドキュメントにアセンブルされることです。反復する必要のないオブジェクト/特殊なケースが必要です。適切なツリーであるかのように lxml メソッドに渡すだけです。

(そのようなフラグメントは、それ自体が完全で正しい xml ドキュメントではないことを認識しています。アセンブリの前に中間生成物をそのようなドキュメントに保存したいと考えています)。

4

1 に答える 1

6

はい、パッケージにはそのような機能があり、orlxml.htmlと呼ばれますが、ほとんどの場合、html パーサーは xml も非常にうまく処理します。fragment_fromstringfragments_fromstring

from lxml import etree, html

xml = """
    <tree id="A"><anotherelement/></tree>
    <tree id="B"><yetanotherelement/></tree>
"""

fragments = html.fragments_fromstring(xml)

root = etree.Element("root")
for f in fragments:
    root.append(f)

print etree.tostring(root, pretty_print=True)

出力:

<root>
  <tree id="A">
    <anotherelement/>
  </tree>
  <tree id="B">
    <yetanotherelement/>
  </tree>
</root>

ボンネットの下で何が起こっているかを見ると、他の結果に満足していない場合、xml パーサーを使用して同じことを行うのはおそらくそれほど難しくありません。

于 2012-05-12T18:57:06.993 に答える