XMLの操作方法を学んだ方法

画像

正直なところ、Habrで同様のトピックに関する記事が見つからなかったのは非常に驚きました。 しかし、このトピックは非常に関連性があり、必要なので、私はそれを少しカバーする自由を取ります。





短期遠足



Pythonでxmlを使用する場合、多くの人がかなり便利な組み込みモジュールxml.dom.minidomを使用します 。 タグの内容を含む、その中のすべての情報は、一種のノードとして提示され、直接作業が行われます。 XML処理コードの一部を次に示します。

Copy Source | Copy HTML app_xml = xmlp.parse( "base.xml" ) id = app_xml.createElement(att) node = app_xml.createTextNode("simple.App") id .appendChild(node) root.appendChild(id) res = open ( "base.xml" , "w" ) res .writelines(app_xml.toprettyxml()) res .close()



  1. Copy Source | Copy HTML app_xml = xmlp.parse( "base.xml" ) id = app_xml.createElement(att) node = app_xml.createTextNode("simple.App") id .appendChild(node) root.appendChild(id) res = open ( "base.xml" , "w" ) res .writelines(app_xml.toprettyxml()) res .close()



  2. Copy Source | Copy HTML app_xml = xmlp.parse( "base.xml" ) id = app_xml.createElement(att) node = app_xml.createTextNode("simple.App") id .appendChild(node) root.appendChild(id) res = open ( "base.xml" , "w" ) res .writelines(app_xml.toprettyxml()) res .close()



  3. Copy Source | Copy HTML app_xml = xmlp.parse( "base.xml" ) id = app_xml.createElement(att) node = app_xml.createTextNode("simple.App") id .appendChild(node) root.appendChild(id) res = open ( "base.xml" , "w" ) res .writelines(app_xml.toprettyxml()) res .close()



  4. Copy Source | Copy HTML app_xml = xmlp.parse( "base.xml" ) id = app_xml.createElement(att) node = app_xml.createTextNode("simple.App") id .appendChild(node) root.appendChild(id) res = open ( "base.xml" , "w" ) res .writelines(app_xml.toprettyxml()) res .close()



  5. Copy Source | Copy HTML app_xml = xmlp.parse( "base.xml" ) id = app_xml.createElement(att) node = app_xml.createTextNode("simple.App") id .appendChild(node) root.appendChild(id) res = open ( "base.xml" , "w" ) res .writelines(app_xml.toprettyxml()) res .close()



  6. Copy Source | Copy HTML app_xml = xmlp.parse( "base.xml" ) id = app_xml.createElement(att) node = app_xml.createTextNode("simple.App") id .appendChild(node) root.appendChild(id) res = open ( "base.xml" , "w" ) res .writelines(app_xml.toprettyxml()) res .close()



  7. Copy Source | Copy HTML app_xml = xmlp.parse( "base.xml" ) id = app_xml.createElement(att) node = app_xml.createTextNode("simple.App") id .appendChild(node) root.appendChild(id) res = open ( "base.xml" , "w" ) res .writelines(app_xml.toprettyxml()) res .close()



  8. Copy Source | Copy HTML app_xml = xmlp.parse( "base.xml" ) id = app_xml.createElement(att) node = app_xml.createTextNode("simple.App") id .appendChild(node) root.appendChild(id) res = open ( "base.xml" , "w" ) res .writelines(app_xml.toprettyxml()) res .close()





想像のとおり 、このすべてのコードは、既存のxmlファイルを開き、文字列「simple.App」を使用して単一のidタグを解析して追加します。 面倒? はい、正しい言葉ではありません。 さらに、別の不快なバグが発見されました-Python 2.4以降、ノードまたはノードツリーの内容をテキスト形式で表示するように設計されたtoprettyxml()関数は、何らかの理由で各行に復帰文字を追加し、その結果として

<id> simple.App </ id>


発行

<id>

simple.App

</ id>


値は変更されないため、これは一見重要ではありませんが、一部のパーサーでは(たとえば、他のデザインで生成されたXMLを使用する場合)、数値データを処理するときにエラーが生成されます。 特に、Adobe AIRアプリケーションのコレクターはこれに罪を犯し、私はバインディングを書きました。

インターネット検索の結果が得られました。 コードでハックを20のコマーシャルの行の追加機能として使用するか、有効なファイルを生成する標準のtoxml()を使用する必要があることが判明しましたが、すべての情報が1行で含まれているため、記述子全体が変わりました混乱に

Copy Source | Copy HTML



  1. <? xml バージョン = '1.0' エンコーディング = 'utf-8'> < application xmlns = "http://ns.adobe.com/air/application/1.5"> < id > simple.test.program </ id > < version > 0.1 </ version > < filename > testapp </ filename > < name > testapp </ name > < initialWindow > < title > AIRアプリケーションのテスト</ title > < content > test.html </ content > < height > 320 </ height > < width > 240 </ width > < visible > true </ visible > < resizable > true </ resizable > </ initialWindow > </ application >


私をエステと呼びますが、大量のファイルがある場合(コメントを含む場合もあります)、そのようなヒープで誤った値を探すのは楽しいことです。

そして、私は代替案を探し始めました。



トンネルの終わりの光



そして、このオプションはlxmlモジュールの形で提供されました。 彼は主題で言及されただけで、彼は彼が作成した怒りのためにxml.dom.minidomscりました:)

次に、追加や書き換えを行わないアプリケーションハンドル生成コードを見てみましょう。

Copy Source | Copy HTML



  1. root = etree.Element( "initialWindow"
  2. etree.SubElement(root、 "title" ).text = title
  3. etree.SubElement(root、 "content" ).text = content
  4. etree.SubElement(ルート、 「高さ」 ).text = str (高さ)
  5. etree.SubElement(ルート、 「幅」 ).text = str (幅)
  6. app_window = etree.tostring(ルート)
  7. ...
  8. root = etree.Element( "application" 、xmlns = "http://ns.adobe.com/air/application/1.5"
  9. etree.SubElement(root、 "id" ).text = id
  10. etree.SubElement(ルート、 「バージョン」 ).text = version
  11. etree.SubElement(root、 "filename" ).text = filename
  12. etree.SubElement(root、 "name" ).text = self .name
  13. root.append(etree.XML(app_window))
  14. ハンドル= etree.tostring(ルート、pretty_print = True、エンコーディング= 'utf-8' 、xml_declaration = True)
  15. applic = openself .fullpath + "/" + self .name + "-app.xml""w"
  16. applic.writelines(ハンドル)
  17. applic.close()


より明確で視覚的なものを見つけませんか? このコードを使用すると、このようなクリーンできれいなXMLを生成できます。

Copy Source | Copy HTML



  1. <? xml バージョン = '1.0' エンコーディング = 'utf-8'>
  2. < application xmlns = "http://ns.adobe.com/air/application/1.5">
  3. < id > simple.test.program </ id >
  4. < バージョン > 0.1 </ バージョン >
  5. < ファイル名 > testapp </ ファイル名 >
  6. < name > testapp </ name >
  7. < initialWindow >
  8. < title > AIRアプリケーションのテスト</ title >
  9. < content > test.html </ content >
  10. < 高さ > 320 </ 高さ >
  11. < > 240 </ >
  12. </ initialWindow >
  13. </ アプリケーション >


コードの90%は説明の必要がないと思います。 すべてのストリートマジックは、 handle = etree.tostring(root、pretty_print = True、encoding = 'utf-8'、xml_declaration = True)という行で囲まれています。 ここで、 pretty_printは、不運なtoprettyxml()の代わりになりますが、それとは異なり、 正常に機能します。 また、エンコードを設定し、XMLドキュメントの標準ヘッダー行を添付します。



奇妙なことに、このモジュールは標準の2倍の速度で動作します。 setuptoolsを介して基本的にインストールされます。

$ sudo easy_install lxml


通常のチュートリアルは公式ウェブサイトにあります。ここに直接リンクがあります。



美しく、便利で有効なコードを長く生き続けましょう! 皆さん、頑張ってコメントを書いてください。



All Articles