Saya memiliki program yang membaca dokumen xml dari soket. Saya mempunyai dokumen xml yang disimpan dalam sebuah string yang ingin saya ubah secara langsung ke kamus Python, dengan cara yang sama dilakukan di simplejson
perpustakaan Django .
Ambil contoh:
str ="<?xml version="1.0" ?><person><name>john</name><age>20</age></person"
dic_xml = convert_to_dic(str)
Kemudian dic_xml
akan terlihat seperti{'person' : { 'name' : 'john', 'age' : 20 } }
python
xml
json
dictionary
xml-deserialization
pengguna361526
sumber
sumber
Jawaban:
Ini adalah modul hebat yang dibuat seseorang. Saya sudah menggunakannya beberapa kali. http://code.activestate.com/recipes/410469-xml-as-dictionary/
Berikut adalah kode dari situs web untuk berjaga-jaga jika tautannya rusak.
Contoh penggunaan:
// Atau, jika Anda ingin menggunakan string XML:
sumber
xmltodict
perpustakaan). Kerugiannya adalah Anda harus menyimpannya sendiri dalam proyek Anda.cElementTree
, cukup ubah baris pertama ke:from xml.etree import cElementTree as ElementTree
xmltodict (pengungkapan penuh: Saya yang menulisnya) melakukan persis seperti itu:
sumber
Cuplikan XML-to-Python-dict berikut mem-parse entitas serta atribut yang mengikuti "spesifikasi" XML-ke-JSON ini . Ini adalah solusi paling umum yang menangani semua kasus XML.
Ini digunakan:
Output dari contoh ini (sesuai "spesifikasi" yang ditautkan di atas) harus:
Tidak selalu cantik, tetapi tidak ambigu, dan masukan XML yang lebih sederhana menghasilkan JSON yang lebih sederhana. :)
Memperbarui
Jika Anda ingin melakukan sebaliknya , keluarkan string XML dari JSON / dict , Anda dapat menggunakan:
sumber
d = {t.tag: {k:v[0] if len(v) == 1 else v for k, v in dd.iteritems()}}
ked = { t.tag: dict( (k, v[0] if len(v) == 1 else v) for k, v in dd.iteritems() ) }
cElementTree
ataulxml.etree
. Perhatikan bahwa saat menggunakan Python 3, semua.iteritems()
harus diubah menjadi.items()
(perilaku yang sama tetapi kata kunci diubah dari Python 2 ke 3).Versi ringan ini, meskipun tidak dapat dikonfigurasi, cukup mudah untuk disesuaikan sesuai kebutuhan, dan berfungsi pada ular sanca tua. Juga kaku - artinya hasilnya sama terlepas dari keberadaan atribut.
Begitu:
Hasil dalam:
sumber
Versi terbaru dari pustaka PicklingTools (1.3.0 dan 1.3.1) mendukung alat untuk mengonversi dari XML ke dikt Python.
Unduhan tersedia di sini: PicklingTools 1.3.1
Ada cukup banyak dokumentasi untuk konverter di sini : dokumentasi menjelaskan secara rinci semua keputusan dan masalah yang akan muncul saat mengonversi antara kamus XML dan Python (ada sejumlah kasus edge: atribut, daftar, daftar anonim, anonim dicts, eval, dll. yang tidak ditangani oleh kebanyakan konverter). Secara umum, konverter mudah digunakan. Jika 'example.xml' berisi:
Kemudian untuk mengubahnya menjadi kamus:
Ada alat untuk mengonversi di C ++ dan Python: C ++ dan Python melakukan konversi indentikal, tetapi C ++ sekitar 60x lebih cepat
sumber
Anda dapat melakukannya dengan cukup mudah dengan lxml. Pertama instal:
Berikut adalah fungsi rekursif yang saya tulis yang melakukan pekerjaan berat untuk Anda:
Varian di bawah ini mempertahankan kunci / elemen induk:
Jika Anda hanya ingin mengembalikan subtree dan mengonversinya menjadi dict, Anda dapat menggunakan Element.find () untuk mendapatkan subtree lalu mengonversinya:
Lihat dokumen lxml di sini . Saya harap ini membantu!
sumber
Penafian: Pengurai XML yang dimodifikasi ini terinspirasi oleh Adam Clark . Pengurai XML asli berfungsi untuk sebagian besar kasus sederhana. Namun, itu tidak berfungsi untuk beberapa file XML yang rumit. Saya men-debug kode baris demi baris dan akhirnya memperbaiki beberapa masalah. Jika Anda menemukan beberapa bug, beri tahu saya. Saya senang memperbaikinya.
sumber
sumber
Parser XML yang paling mudah digunakan untuk Python adalah ElementTree (mulai 2.5x dan di atasnya ada di pustaka standar xml.etree.ElementTree). Saya tidak berpikir ada sesuatu yang melakukan apa yang Anda inginkan di luar kotak. Akan sangat sepele untuk menulis sesuatu untuk melakukan apa yang Anda inginkan menggunakan ElementTree, tapi mengapa mengonversi ke kamus, dan mengapa tidak menggunakan ElementTree secara langsung.
sumber
Kode dari http://code.activestate.com/recipes/410469-xml-as-dictionary/ berfungsi dengan baik, tetapi jika ada beberapa elemen yang sama di tempat tertentu dalam hierarki, kode itu hanya menimpanya.
Saya menambahkan shim antara yang terlihat untuk melihat apakah elemen sudah ada sebelum self.update (). Jika demikian, munculkan entri yang ada dan buat daftar dari yang sudah ada dan yang baru. Setiap duplikat berikutnya ditambahkan ke daftar.
Tidak yakin apakah ini dapat ditangani dengan lebih anggun, tetapi berhasil:
sumber
Dari @ K3 --- respons rnc (yang terbaik untuk saya) saya telah menambahkan sedikit modifikasi untuk mendapatkan OrderedDict dari teks XML (terkadang urutan penting):
Mengikuti contoh @ K3 --- rnc, Anda dapat menggunakannya:
Semoga membantu;)
sumber
Berikut tautan ke solusi ActiveState - dan kode jika hilang lagi.
sumber
Pada satu titik saya harus mengurai dan menulis XML yang hanya terdiri dari elemen tanpa atribut sehingga pemetaan 1: 1 dari XML ke dikt dapat dilakukan dengan mudah. Inilah yang saya temukan jika orang lain juga tidak membutuhkan atribut:
sumber
@dibrovsd: Solusi tidak akan berfungsi jika xml memiliki lebih dari satu tag dengan nama yang sama
Sesuai pemikiran Anda, saya telah sedikit memodifikasi kode dan menulisnya untuk node umum, bukan root:
sumber
Saya telah mengubah salah satu jawaban sesuai selera saya dan bekerja dengan banyak nilai dengan tag yang sama misalnya pertimbangkan kode xml berikut yang disimpan dalam file XML.xml
dan dengan python
hasilnya adalah
sumber
Saya memiliki metode rekursif untuk mendapatkan kamus dari elemen lxml
sumber