2009-08-18 12 views
5

PythonでXMLファイルのDOMインスタンス(ツリー)を取得する方法を知っている人はいませんか。私は、要素と属性を異なる順序で持つ可能性のある2つのXML文書を互いに比較しようとしています。どうすればいい?XML文書のDOMツリーの取得

答えて

2

個人的には、可能であればelementtreeから始めることをお勧めします(Pythonの標準ライブラリ、またはlxmlの実装に含まれているCの実装が望ましいが、それは高速性の問題である)。これは標準に準拠したDOMではありませんが、Pythonicでより手軽な方法で同じ情報を保持します。 xml.etree.ElementTree.parseを呼び出すことから始めることができます。これはXMLソースを取り、要素ツリーを返します。両方のソースでそれを行い、各要素ツリーでgetrootを使用してルート要素を取得し、ルート要素から再帰的に要素を比較します。

エレメントの子要素は、標準DOMと同様にエレメントツリー内にシーケンスを形成します。つまり、その順序は重要であるとみなされます。 Pythonのセットを作るのは簡単です(あるいは、順序はそうではありませんが、繰り返しが重要な場合は、何らかの種類の「複数セット」という努力をしています)。一意性が保証され、秩序が意味的に関連しない、所与の要素の属性にとってはさらに簡単です。

要素ツリーのような別のコンテナではなく、標準DOMが必要な特定の理由がありますか、要素ツリーがOKになるようにDOMという用語を一般的な意味で使用していますか?

これまでは、PyRXPを使用しても良い結果が得られました。これは、ElementTreeよりもはるかに単純で明瞭な表現を使用しています。しかし、それは何年も何年も前でした。 PyRXPが今日lxmlやcElementTreeとどう比較されたかについての最近の経験はありません。

1

熟考するいくつかの解決策:

+0

私はminidomを調べましたが、解析されたファイルからDOMツリーを取得する方法に関するドキュメントには何も情報はありません。私は順序が重要ではないように2本の木を比較したいと思う。これをどうやって行うのか考えていますか? – Dave

+0

Python 2.6のminidom documeentationは、ファイルからDOMを取得する例を示しています(何かの後にいますか?) from xml.dom。minidom import parse、parseString dom1 = parse( 'c:\\ temp \\ mydata.xml')#名前でXMLファイルを解析する – Mark

0

XML文書インスタンス、解析されたDOMツリーの比較ナイーブは動作しません比較するため。大きな子要素の順序がある場合は

  • :あなたはおそらく、再帰的のような特定の基準に基づいていくつかの他のノードとその子、ノードとノードとその子・ノードを比較し、独自のNodeComperatorを実装する必要があります?
  • テキストコンテンツの空白が重要なのはいつですか?
  • 一部の要素にはデフォルト値があり、パーサーによって適用されていますか?
  • 万一実体参照を比較

Minidomのために展開されたファイルを解析するための良い出発点であると使いやすいです。しかし、特定のアプリケーションの比較関数の実際の実装は、あなたが行う必要があります。

関連する問題