Apa cara terbaik (atau berbagai cara) untuk mencetak XML dengan Python?
python
xml
pretty-print
Hortitude
sumber
sumber
lxml baru-baru ini, diperbarui, dan mencakup fungsi cetak yang cantik
Lihatlah tutorial lxml: http://lxml.de/tutorial.html
sumber
aptitude install
jauh. Di bawah OS / X saya tidak yakin.print(etree.tostring(x, pretty_print=True, encoding="unicode"))
. Menulis ke file output dimungkinkan hanya dalam satu baris, tidak ada variabel perantara yang diperlukan:etree.parse("filename").write("outputfile", encoding="utf-8")
Solusi lain adalah meminjam fungsi ini
indent
, untuk digunakan dengan pustaka ElementTree yang dibangun di dalam Python sejak 2.5. Ini akan terlihat seperti apa:sumber
tree.write([filename])
untuk menulis ke file (tree
menjadi instance ElementTree).tree = ElementTree.parse('file) ; root = tree.getroot() ; indent(root); tree.write('Out.xml');
Inilah solusi (peretasan?) Saya untuk mengatasi masalah simpul teks yang jelek.
Kode di atas akan menghasilkan:
Alih-alih ini:
Penafian: Mungkin ada beberapa batasan.
sumber
re.compile
sebelumsub
operasi (saya menggunakanre.findall()
dua kali,zip
dan satufor
loop denganstr.replace()
...)Seperti yang ditunjukkan orang lain, lxml memiliki printer yang cukup bawaan.
Ketahuilah bahwa secara default ia mengubah bagian CDATA menjadi teks biasa, yang dapat memberikan hasil buruk.
Berikut adalah fungsi Python yang mempertahankan file input dan hanya mengubah indentasi (perhatikan
strip_cdata=False
). Selain itu memastikan bahwa output menggunakan UTF-8 sebagai pengkodean bukan ASCII default (perhatikanencoding='utf-8'
):Contoh penggunaan:
sumber
BeautifulSoup memiliki cara yang mudah digunakan
prettify()
.Itu indentasi satu ruang per tingkat lekukan. Ini bekerja jauh lebih baik daripada pretty_print lxml dan pendek dan manis.
sumber
bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: xml. Do you need to install a parser library?
Jika sudah,
xmllint
Anda dapat menelurkan subproses dan menggunakannya.xmllint --format <file>
cukup mencetak inputnya XML ke output standar.Perhatikan bahwa metode ini menggunakan program eksternal ke python, yang membuatnya menjadi semacam peretasan.
sumber
Saya mencoba mengedit jawaban "ade" di atas, tetapi Stack Overflow tidak akan membiarkan saya mengedit setelah saya awalnya memberikan umpan balik secara anonim. Ini adalah versi fungsi yang kurang buggy untuk mencetak ElementTree dengan cantik.
sumber
Jika Anda menggunakan implementasi DOM, masing-masing memiliki bentuk built-in pencetakan cantik:
Jika Anda menggunakan sesuatu yang lain tanpa printer cantiknya sendiri - atau printer cantik itu tidak cukup melakukannya seperti yang Anda inginkan - Anda mungkin harus menulis atau mensubklasifikasikan serialiser Anda sendiri.
sumber
Saya memiliki beberapa masalah dengan cetakan cantik minidom. Saya akan mendapatkan UnicodeError setiap kali saya mencoba cukup mencetak dokumen dengan karakter di luar pengkodean yang diberikan, misalnya jika saya memiliki β dalam dokumen dan saya mencoba
doc.toprettyxml(encoding='latin-1')
. Inilah solusi saya untuk itu:sumber
Itu tidak akan menambahkan spasi atau baris baru di dalam simpul teks, kecuali jika Anda memintanya dengan:
Anda dapat menentukan seperti apa unit indentasi itu dan seperti apa baris baru itu.
Doc ada di beranda http://www.yattag.org .
sumber
Saya menulis solusi untuk berjalan melalui ElementTree yang ada dan menggunakan teks / ekor untuk membuat indentasi seperti yang biasanya diharapkan.
sumber
Cetak cukup XML untuk python terlihat cukup bagus untuk tugas ini. (Dinamai dengan tepat juga.)
Alternatifnya adalah menggunakan pyXML , yang memiliki fungsi PrettyPrint .
sumber
HTTPError: 404 Client Error: Not Found for url: https://pypi.org/simple/xmlpp/
Bayangkan proyek itu ada di loteng saat ini, sayang.Anda dapat menggunakan perpustakaan eksternal xmltodict populer , dengan
unparse
danpretty=True
Anda akan mendapatkan hasil terbaik:full_document=False
melawan<?xml version="1.0" encoding="UTF-8"?>
di atas.sumber
Berikut adalah solusi Python3 yang menghilangkan masalah baris baru yang jelek (ton spasi), dan itu hanya menggunakan perpustakaan standar tidak seperti kebanyakan implementasi lainnya.
Saya menemukan cara memperbaiki masalah baris baru yang umum di sini .
sumber
Lihatlah modul vkbeautify .
Ini adalah versi python dari plugin javascript / nodejs saya yang sangat populer dengan nama yang sama. Ini bisa mencetak / memperkecil XML, JSON dan teks CSS. Input dan output dapat berupa string / file dalam kombinasi apa pun. Ini sangat kompak dan tidak memiliki ketergantungan.
Contoh :
sumber
Alternatif jika Anda tidak ingin mengulang , ada perpustakaan xmlpp.py dengan
get_pprint()
fungsinya. Ini bekerja dengan baik dan lancar untuk kasus penggunaan saya, tanpa harus mem-reparse ke objek ElementTree lxml.sumber
Anda dapat mencoba variasi ini ...
Instal
BeautifulSoup
danlxml
pustaka backend (parser):Memproses dokumen XML Anda:
sumber
'lxml'
menggunakan parser HTML lxml - lihat dokumen BS4 . Anda perlu'xml'
atau'lxml-xml'
untuk parser XML.lxml’s XML parser BeautifulSoup(markup, "lxml-xml") BeautifulSoup(markup, "xml")
lxml-xml
), dan kemudian mereka melanjutkan untuk downvote pada hari yang sama. Saya mengajukan keluhan resmi ke S / O tetapi mereka menolak untuk menyelidiki. Lagi pula, saya telah sejak "merusak" jawaban saya, yang sekarang benar lagi (dan menentukanlxml-xml
seperti yang awalnya). Terima kasih.Saya punya masalah ini dan menyelesaikannya seperti ini:
Dalam kode saya metode ini disebut seperti ini:
Ini hanya berfungsi karena etree secara default menggunakan
two spaces
indent, yang menurut saya tidak terlalu menekankan indentasi dan karenanya tidak cantik. Saya tidak dapat menentukan pengaturan etree atau parameter untuk fungsi apa pun untuk mengubah indentasi etree standar. Saya suka betapa mudahnya menggunakan etree, tapi ini benar-benar mengganggu saya.sumber
Untuk mengonversi seluruh dokumen xml ke dokumen xml yang cantik
(mis: anggap Anda telah mengekstrak [unzip] file LibreOffice Writer .odt atau .ods, dan Anda ingin mengonversi file "content.xml" yang jelek ke file yang cukup untuk kontrol versi git otomatis dan
git difftool
file .odt / .ods , seperti yang saya laksanakan di sini )Referensi:
- Terima kasih atas jawaban Ben Noland di halaman ini yang membuat saya hampir sampai ke sana.
sumber
Ini bekerja dengan baik untuk xml dengan bahasa Mandarin!
sumber
Jika karena alasan tertentu Anda tidak bisa mendapatkan modul Python apa pun yang disebutkan pengguna lain, saya sarankan solusi berikut untuk Python 2.7:
Sejauh yang saya tahu, solusi ini akan bekerja pada sistem berbasis Unix yang memiliki
xmllint
paket yang diinstal.sumber
check_output
karena Anda tidak perlu melakukan pengecekan kesalahanSaya memecahkan ini dengan beberapa baris kode, membuka file, melewatinya dan menambahkan lekukan, lalu menyimpannya lagi. Saya sedang bekerja dengan file xml kecil, dan tidak ingin menambahkan dependensi, atau lebih banyak perpustakaan untuk diinstal untuk pengguna. Bagaimanapun, inilah yang akhirnya saya dapatkan:
Ini bekerja untuk saya, mungkin seseorang akan menggunakannya :)
sumber