Saat ini, opsi paling populer (dan sangat sederhana) adalah ElementTree API , yang telah dimasukkan dalam pustaka standar sejak Python 2.5.
Opsi yang tersedia untuk itu adalah:
- ElementTree (Dasar, implementasi Python murni dari ElementTree. Bagian dari pustaka standar sejak 2.5)
- cElementTree (Dioptimalkan implementasi C dari ElementTree. Juga ditawarkan di perpustakaan standar sejak 2.5)
- LXML (Berdasarkan libxml2. Menawarkan superset yang kaya dari ElementTree API serta XPath, Pemilih CSS, dan banyak lagi)
Berikut ini adalah contoh cara membuat dokumen contoh menggunakan 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")
Saya sudah mengujinya dan berfungsi, tapi saya berasumsi spasi tidak signifikan. Jika Anda membutuhkan lekukan "cetak awal", beri tahu saya dan saya akan mencari cara melakukannya. (Ini mungkin opsi khusus LXML. Saya tidak terlalu banyak menggunakan stdlib implementasi)
Untuk bacaan lebih lanjut, berikut adalah beberapa tautan bermanfaat:
Sebagai catatan terakhir, baik cElementTree atau LXML harus cukup cepat untuk semua kebutuhan Anda (keduanya adalah kode C yang dioptimalkan), tetapi jika Anda berada dalam situasi di mana Anda perlu memeras setiap bit kinerja terakhir, tolok ukur pada situs LXML menunjukkan bahwa:
- LXML jelas menang untuk serialisasi (menghasilkan) XML
- Sebagai efek samping dari penerapan induk traversal yang tepat, LXML sedikit lebih lambat dari cElementTree untuk penguraian.
xml_declaration=True
jika Anda menentukan pengkodean ... tetapi, untuk mendapatkan perilaku yang setara, panggiltree.write()
seperti ini:tree.write("filename.xml", xml_declaration=True, encoding='utf-8')
Anda dapat menggunakan pengkodean apa saja selama Anda secara eksplisit menentukan satu. (ascii
akan memaksa semua karakter Unicode di luar ASCII 7-bit yang ditetapkan untuk dikodekan entitas jika Anda tidak mempercayai server web untuk dikonfigurasikan dengan benar.)vlaue2
kevalue2
: ketik adalah output XML yang diminta di pertanyaan awal. Sampai itu berubah, kesalahan ketik di sini sebenarnya sudah benar.cElementTree
disusutkan dalam Python 3.3The perpustakaan lxml termasuk sintaks yang sangat nyaman untuk generasi XML, yang disebut E-pabrik . Inilah cara saya membuat contoh yang Anda berikan:
Keluaran:
Ini juga mendukung penambahan ke simpul yang sudah dibuat, misalnya setelah di atas Anda bisa mengatakan
sumber
getattr
, misalnyagetattr(E, "some-tag")
,.Yattag http://www.yattag.org/ atau https://github.com/leforestier/yattag menyediakan API yang menarik untuk membuat dokumen XML tersebut (dan juga dokumen HTML).
Itu menggunakan manajer konteks dan
with
kata kunci.jadi Anda akan mendapatkan:
sumber
Untuk pilihan yang paling sederhana, saya akan menggunakan minidom: http://docs.python.org/library/xml.dom.minidom.html . Itu dibangun ke perpustakaan standar python dan mudah digunakan dalam kasus-kasus sederhana.
Berikut ini tutorial yang cukup mudah untuk diikuti: http://www.boddie.org.uk/python/XML_intro.html
sumber
Untuk struktur XML sederhana seperti itu, Anda mungkin tidak ingin melibatkan modul XML penuh sesak nafas. Pertimbangkan templat string untuk struktur paling sederhana, atau Jinja untuk sesuatu yang sedikit lebih kompleks. Jinja dapat menangani perulangan pada daftar data untuk menghasilkan xml bagian dalam daftar dokumen Anda. Itu agak rumit dengan template string python mentah
Untuk contoh Jinja, lihat jawaban saya untuk pertanyaan serupa .
Berikut ini contoh membuat xml Anda dengan templat string.
Keluaran:
Kelemahan dari pendekatan template adalah bahwa Anda tidak akan lolos
<
dan>
gratis. Saya menari di sekitar masalah itu dengan menarik util darixml.sax
sumber
Saya baru saja selesai menulis generator xml, menggunakan metode Templat bigh_29 ... ini adalah cara yang bagus untuk mengontrol apa yang Anda hasilkan tanpa terlalu banyak Objek yang mendapatkan 'penghalang'.
Adapun tag dan nilai, saya menggunakan dua array, satu yang memberi nama tag dan posisi di output xml dan yang lain yang mereferensikan file parameter yang memiliki daftar tag yang sama. File parameter, bagaimanapun, juga memiliki nomor posisi dalam file input (csv) yang sesuai di mana data akan diambil. Dengan cara ini, jika ada perubahan pada posisi data yang masuk dari file input, program tidak berubah; itu secara dinamis bekerja posisi bidang data dari tag yang sesuai dalam file parameter.
sumber