回答:
最近、最も人気のある(そして非常にシンプルな)オプションはElementTree APIで、Python 2.5以降の標準ライブラリに含まれています。
利用可能なオプションは次のとおりです。
以下は、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")
私はそれをテストしました、そしてそれは機能します、しかし私は空白が重要ではないと仮定しています。「プリティプリント」のインデントが必要な場合はお知らせください。その方法を調べます。(これはLXML固有のオプションである可能性があります。私はstdlib実装をあまり使用していません)
さらに読むために、ここにいくつかの便利なリンクがあります:
最後の注意として、cElementTreeまたはLXMLはすべてのニーズに対して十分に高速でなければなりません(どちらも最適化されたCコードです)が、パフォーマンスの最後のすべてのビットを絞り出す必要がある状況では、ベンチマークLXMLサイトは次のことを示しています。
xml_declaration=True
はエンコーディングを指定した場合にのみ従うように見えるので...しかし、同等の動作を得るには、次のtree.write()
ように呼び出しtree.write("filename.xml", xml_declaration=True, encoding='utf-8')
ます。明示的に指定する限り、任意のエンコーディングを使用できます。 1。(ascii
Webサーバーが適切に構成されていない場合は、7ビットASCIIセット外のすべてのUnicode文字がエンティティエンコードされることを
vlaue2
にvalue2
タイプミスが元の質問で要求されたXML出力にあります。それが変わるまで、ここのタイプミスは実際には正しいです。
lxmlのライブラリが呼ばれるXML生成のために非常に便利な構文、含まE-工場を。ここにあなたが与える例を私が作る方法があります:
#!/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'))
getattr
、などを使用できますgetattr(E, "some-tag")
。
Yattag http://www.yattag.org/またはhttps://github.com/leforestier/yattagは、このようなXMLドキュメント(およびHTMLドキュメント)を作成するための興味深いAPIを提供します。
コンテキストマネージャーと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>
最も簡単な選択として、私はminidomを使用します:http ://docs.python.org/library/xml.dom.minidom.html 。これはpython標準ライブラリに組み込まれており、単純なケースで簡単に使用できます。
以下のチュートリアルは非常に簡単です。http://www.boddie.org.uk/python/XML_intro.html
このような単純な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 <value> for the <bar> document</field2>
</doc>
</root>
テンプレートアプローチのダウナーは、あなたがのエスケープを取得することはありませんということです<
し、>
自由のために。私はから問題を回避するためにutilをxml.sax
私は、bigh_29のテンプレートのメソッドを使用してxmlジェネレーターの作成を終了しました。オブジェクトの数が多すぎて「邪魔になる」ことなく、出力内容を制御する優れた方法です。
タグと値については、2つの配列を使用しました。1つは出力xmlでのタグ名と位置を指定し、もう1つは同じタグのリストを持つパラメーターファイルを参照しました。ただし、パラメーターファイルには、対応する入力(csv)ファイル内のデータが取得される位置番号も含まれています。このように、入力ファイルから入ってくるデータの位置に変更があっても、プログラムは変更されません。パラメータファイルの適切なタグからデータフィールドの位置を動的に計算します。