web-dev-qa-db-ja.com

Pythonを使用して簡単なXMLファイルを作成する

Pythonで簡単なXMLファイルを作成したい場合のオプションは何ですか? (ライブラリに関して)

欲しいxmlは次のようになります。

<root>
 <doc>
     <field1 name="blah">some value1</field1>
     <field2 name="asdfasd">some vlaue2</field2>
 </doc>

</root>
137
Blankman

最近、最も一般的な(そして非常にシンプルな)オプションは ElementTree API です。これはPython 2.5から標準ライブラリに含まれています。

利用可能なオプションは次のとおりです。

  • ElementTree(ElementTreeの基本的な純粋なPython実装。2.5以降の標準ライブラリの一部)
  • cElementTree(ElementTreeの最適化されたC実装。2.5以降の標準ライブラリでも提供)
  • LXML(libxml2に基づく。ElementTreeAPIの豊富なスーパーセットに加えて、XPath、CSSセレクターなどを提供します)

In-stdlib cElementTreeを使用してサンプルドキュメントを生成する方法の例を次に示します。

import xml.etree.cElementTree as ET

root = ET.Element("root")
doc = ET.SubElement(root, "doc")

ET.SubElement(doc, "field1", name="blah").text = "some value1"
ET.SubElement(doc, "field2", name="asdfasd").text = "some vlaue2"

tree = ET.ElementTree(root)
tree.write("filename.xml")

私はそれをテストしましたが、動作しますが、空白は重要ではないと仮定しています。 「prettyprint」インデントが必要な場合はお知らせください。その方法を調べます。 (これはLXML固有のオプションである可能性があります。stdlib実装はあまり使用しません)

さらに読むために、ここにいくつかの便利なリンクがあります:

最後の注意点として、cElementTreeまたはLXMLのいずれかがすべてのニーズに対して十分に高速である必要があります(両方とも最適化されたCコードです)が、パフォーマンスの最後のすべてのビットを絞り出す必要がある場合LXMLサイトは次のことを示しています。

  • LXMLはXMLのシリアル化(生成)で明らかに勝ちます
  • 適切な親トラバーサルを実装する副作用として、LXMLは解析のためにcElementTreeよりも少し遅くなります。
260
ssokolow

lxml library には、 E-factory と呼ばれる非常に便利なXML生成の構文が含まれています。以下に例を示します。

#!/usr/bin/python
import lxml.etree
import lxml.builder    

E = lxml.builder.ElementMaker()
ROOT = E.root
DOC = E.doc
FIELD1 = E.field1
FIELD2 = E.field2

the_doc = ROOT(
        DOC(
            FIELD1('some value1', name='blah'),
            FIELD2('some value2', name='asdfasd'),
            )   
        )   

print lxml.etree.tostring(the_doc, pretty_print=True)

出力:

<root>
  <doc>
    <field1 name="blah">some value1</field1>
    <field2 name="asdfasd">some value2</field2>
  </doc>
</root>

また、すでに作成されたノードへの追加もサポートしています。上記の後、あなたは言うことができます

the_doc.append(FIELD2('another value again', name='hithere'))
56
rescdsk

Yattag http://www.yattag.org/ または https://github.com/leforestier/yattag は、このようなXMLドキュメント(およびHTML文書)。

context manager およびwithキーワードを使用しています。

from yattag import Doc, indent

doc, tag, text = Doc().tagtext()

with tag('root'):
    with tag('doc'):
        with tag('field1', name='blah'):
            text('some value1')
        with tag('field2', name='asdfasd'):
            text('some value2')

result = indent(
    doc.getvalue(),
    indentation = ' '*4,
    newline = '\r\n'
)

print(result)

次のようになります:

<root>
    <doc>
        <field1 name="blah">some value1</field1>
        <field2 name="asdfasd">some value2</field2>
    </doc>
</root>
14
scls

最も簡単な選択として、minidomを使用します: http://docs.python.org/library/xml.dom.minidom.html Python標準ライブラリに組み込まれており、簡単な場合に簡単に使用できます。

これは非常に簡単なチュートリアルです: http://www.boddie.org.uk/python/XML_intro.html

6
whaley

このような単純なXML構造の場合、本格的なXMLモジュールを使用したくない場合があります。最も単純な構造には文字列テンプレートを、もう少し複雑な構造にはJinjaを検討してください。 Jinjaは、データのリストをループ処理して、ドキュメントリストの内部xmlを生成できます。それは生のPython文字列テンプレートでは少しトリッキーです

Jinjaの例については、私の 同様の質問への回答 を参照してください。

文字列テンプレートを使用してxmlを生成する例を次に示します。

import string
from xml.sax.saxutils import escape

inner_template = string.Template('    <field${id} name="${name}">${value}</field${id}>')

outer_template = string.Template("""<root>
 <doc>
${document_list}
 </doc>
</root>
 """)

data = [
    (1, 'foo', 'The value for the foo document'),
    (2, 'bar', 'The <value> for the <bar> document'),
]

inner_contents = [inner_template.substitute(id=id, name=name, value=escape(value)) for (id, name, value) in data]
result = outer_template.substitute(document_list='\n'.join(inner_contents))
print result

出力:

<root>
 <doc>
    <field1 name="foo">The value for the foo document</field1>
    <field2 name="bar">The &lt;value&gt; for the &lt;bar&gt; document</field2>
 </doc>
</root>

テンプレートアプローチの欠点は、<>を無料でエスケープできないことです。 xml.saxからutilを取り込むことで、その問題を回避しました

3
bigh_29

テンプレートのbigh_29のメソッドを使用して、xmlジェネレーターの記述を終了しました...これは、多くのオブジェクトが「邪魔」にならずに、出力するものを制御する素晴らしい方法です。

タグと値に関しては、2つの配列を使用しました。1つは出力XML内のタグ名と位置を提供し、もう1つは同じタグのリストを持つパラメーターファイルを参照しました。ただし、パラメータファイルには、データの取得元である対応する入力(csv)ファイル内の位置番号もあります。このように、入力ファイルから入ってくるデータの位置に変更があったとしても、プログラムは変わりません。パラメータファイル内の適切なタグからデータフィールドの位置を動的に算出します。

0
Cloughie

タグと値は、事前に使用する必要があります。例として表示するコードを見つける前にこれを行いました。

一方、詳細はこちらをご覧ください- https://www.w3schools.com/php/

0
John