14

(html ドキュメントから形成された) etree のツリー構造を区別可能な方法で出力したいと思います (つまり、2 つの etree は異なる方法で出力する必要があります)。

構造とは、基本的にすべてのタグを意味しますが、属性やテキスト コンテンツを含まないツリーの「形状」です。

何か案が?それを行うためにlxmlに何かがありますか?

そうでない場合は、ツリー全体を反復処理して、そこから文字列を作成する必要があると思います。コンパクトな方法でツリーを表現する方法はありますか? (「コンパクト」機能はあまり関係ありません)

参考までに、それは見ることを意図したものではありませんが、いくつかの html テンプレート間で違いを生み出すことができるように保存およびハッシュ化することを目的としています。

ありがとう

4

1 に答える 1

10

おそらく、ソース XML に対して XSLT を実行して、タグ以外のすべてを削除するだけで、etree.tostringハッシュ可能な文字列を取得するのに十分簡単です...

from lxml import etree as ET

def pp(e):
    print ET.tostring(e, pretty_print=True)
    print

root = ET.XML("""\
<project id="8dce5d94-4273-47ef-8d1b-0c7882f91caa" kpf_version="4">
<livefolder id="8744bc67-1b9e-443d-ba9f-96e1d0007ba8" idref="707cd68a-33b5-4051-9e40-8ba686c2fdb8">Mooo</livefolder>
<livefolder id="8744bc67-1b9e-443d-ba9f" idref="707cd68a-33b5-4051-9e40-8ba686c2fdb8" />
<preference-set idref="8dce5d94-4273-47ef-8d1b-0c7882f91caa">
  <boolean id="import_live">0</boolean>
</preference-set>
</project>
""")
pp(root)


xslt = ET.XML("""\
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="*">
    <xsl:copy>
      <xsl:apply-templates select="*"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
""")
tr = ET.XSLT(xslt)

doc2 = tr(root)
root2 = doc2.getroot()
pp(root2)

出力が得られます:

<project id="8dce5d94-4273-47ef-8d1b-0c7882f91caa" kpf_version="4">
  <livefolder id="8744bc67-1b9e-443d-ba9f-96e1d0007ba8" idref="707cd68a-33b5-4051-9e40-8ba686c2fdb8">Mooo</livefolder>
  <livefolder id="8744bc67-1b9e-443d-ba9f" idref="707cd68a-33b5-4051-9e40-8ba686c2fdb8"/>
  <preference-set idref="8dce5d94-4273-47ef-8d1b-0c7882f91caa">
    <boolean id="import_live">0</boolean>
  </preference-set>
</project>

<project>
  <livefolder/>
  <livefolder/>
  <preference-set>
    <boolean/>
  </preference-set>
</project>
于 2012-10-30T07:35:33.267 に答える