Saya memiliki banyak baris dalam database yang berisi XML dan saya mencoba menulis skrip Python untuk menghitung instance dari atribut node tertentu.
Pohon saya terlihat seperti:
<foo>
<bar>
<type foobar="1"/>
<type foobar="2"/>
</bar>
</foo>
Bagaimana saya bisa mengakses atribut "1"
dan "2"
dalam XML menggunakan Python?
Jawaban:
Saya sarankan
ElementTree
. Ada implementasi lain yang kompatibel dari API yang sama, sepertilxml
, dancElementTree
di pustaka standar Python itu sendiri; tetapi, dalam konteks ini, apa yang terutama mereka tambahkan bahkan lebih cepat - kemudahan bagian pemrograman tergantung pada API, yangElementTree
mendefinisikan.Pertama-tama buat instance Elemen
root
dari XML, misalnya dengan fungsi XML , atau dengan mem-parsing file dengan sesuatu seperti:Atau salah satu dari banyak cara lain yang ditunjukkan di
ElementTree
. Kemudian lakukan sesuatu seperti:Dan serupa, biasanya cukup sederhana, pola kode.
sumber
lxml
menambahkan lebih dari kecepatan. Ini memberikan akses mudah ke informasi seperti simpul orangtua, nomor baris dalam sumber XML, dll. Yang dapat sangat berguna dalam beberapa skenario.Warning The xml.etree.ElementTree module is not secure against maliciously constructed data. If you need to parse untrusted or unauthenticated data see XML vulnerabilities.
minidom
adalah yang tercepat dan cukup lurus ke depan.XML:
Python:
Keluaran:
sumber
item
langsung dari tingkat atas dokumen? bukankah akan lebih bersih jika Anda menyediakan path (data->items
)? karena, bagaimana jika Anda juga memilikidata->secondSetOfItems
node yang bernamaitem
dan Anda ingin daftar hanya satu dari dua setitem
?Anda dapat menggunakan BeautifulSoup :
sumber
BeautifulStoneSoup
. Cukup gunakanBeautifulSoup(source_xml, features="xml")
ElementTree
, sayangnya tidak dapat mengurai kecuali saya menyesuaikan sumber di tempat tetapiBeautifulSoup
bekerja segera tanpa perubahan!Ada banyak opsi di luar sana. cElementTree terlihat bagus jika kecepatan dan penggunaan memori menjadi masalah. Ini memiliki overhead yang sangat sedikit dibandingkan dengan hanya membaca di file menggunakan
readlines
.Metrik yang relevan dapat ditemukan pada tabel di bawah ini, disalin dari situs web cElementTree :
Seperti yang ditunjukkan oleh @jfs ,
cElementTree
dibundel dengan Python:from xml.etree import cElementTree as ElementTree
.from xml.etree import ElementTree
(versi C dipercepat digunakan secara otomatis).sumber
from xml.etree import cElementTree as ElementTree
. Pada Python 3:from xml.etree import ElementTree
(versi C yang dipercepat digunakan secara otomatis)ElementTree
untuk tugas tertentu. Untuk dokumen yang sesuai dengan memori, jauh lebih mudah digunakanminidom
, dan berfungsi baik untuk dokumen XML yang lebih kecil.Saya sarankan xmltodict untuk kesederhanaan.
Itu mem-parsing XML Anda ke OrderedDict;
sumber
result["foo"]["bar"]["type"]
adalah daftar semua<type>
elemen, jadi masih berfungsi (meskipun strukturnya mungkin sedikit tidak terduga).lxml.objectify sangat sederhana.
Mengambil teks sampel Anda:
Keluaran:
sumber
count
menyimpan jumlah setiap item dalam kamus dengan kunci default, jadi Anda tidak perlu memeriksa keanggotaan. Anda juga dapat mencoba melihatcollections.Counter
.Python memiliki antarmuka ke parser XML expat.
Ini adalah parser yang tidak valid, jadi XML yang buruk tidak akan ditangkap. Tetapi jika Anda tahu file Anda benar, maka ini cukup bagus, dan Anda mungkin akan mendapatkan info persis yang Anda inginkan dan Anda dapat membuang sisanya dengan cepat.
sumber
Saya mungkin menyarankan declxml .
Pengungkapan penuh: Saya menulis perpustakaan ini karena saya sedang mencari cara untuk mengkonversi antara struktur data XML dan Python tanpa perlu menulis lusinan baris kode penguraian / serialisasi imperatif dengan ElementTree.
Dengan declxml, Anda menggunakan prosesor untuk secara deklaratif mendefinisikan struktur dokumen XML Anda dan cara memetakan antara struktur data XML dan Python. Prosesor digunakan untuk serialisasi dan parsing serta tingkat validasi dasar.
Parsing ke dalam struktur data Python sangat mudah:
Yang menghasilkan output:
Anda juga dapat menggunakan prosesor yang sama untuk membuat serialisasi data ke XML
Yang menghasilkan output sebagai berikut
Jika Anda ingin bekerja dengan objek alih-alih kamus, Anda dapat menentukan prosesor untuk mengubah data ke dan dari objek juga.
Yang menghasilkan output sebagai berikut
sumber
Hanya untuk menambahkan kemungkinan lain, Anda dapat menggunakan untangle , karena ini adalah pustaka xml-to-python-object yang sederhana. Di sini Anda memiliki contoh:
Instalasi:
Pemakaian:
File XML Anda (sedikit berubah):
Mengakses atribut dengan
untangle
:Outputnya adalah:
Informasi lebih lanjut tentang untangle dapat ditemukan di " untangle ".
Juga, jika Anda penasaran, Anda dapat menemukan daftar alat untuk bekerja dengan XML dan Python di " Python dan XML ". Anda juga akan melihat bahwa yang paling umum disebutkan oleh jawaban sebelumnya.
sumber
Di sini menggunakan kode yang sangat sederhana namun efektif
cElementTree
.Ini dari " python xml parse ".
sumber
XML:
Kode python:
Keluaran:
sumber
Ini akan mencetak nilai
foobar
atribut.sumber
xml.etree.ElementTree vs lxml
Ini adalah beberapa kelebihan dari dua perpustakaan yang paling sering saya manfaatkan untuk diketahui sebelum memilih di antara mereka.
xml.etree.ElementTree:
lxml
standalone="no"
?.node
.sourceline
memungkinkan untuk dengan mudah mendapatkan garis elemen XML yang Anda gunakan.sumber
Saya menemukan Python xml.dom dan xml.dom.minidom cukup mudah. Ingatlah bahwa DOM tidak baik untuk XML dalam jumlah besar, tetapi jika input Anda cukup kecil maka ini akan berfungsi dengan baik.
sumber
Tidak perlu menggunakan API khusus lib jika Anda menggunakannya
python-benedict
. Inisialisasi saja instance baru dari XML Anda dan kelola dengan mudah karena merupakandict
subclass.Instalasi mudah:
pip install python-benedict
Mendukung dan menormalkan I / O operasi dengan banyak format:
Base64
,CSV
,JSON
,TOML
,XML
,YAML
danquery-string
.Ini diuji dengan baik dan open-source di GitHub .
sumber
sumber
Jika sumbernya adalah file xml, katakan seperti contoh ini
Anda dapat mencoba kode berikut
Output akan menjadi
sumber