Saya mencoba mengonversi xml ke json di php. Jika saya melakukan konversi sederhana menggunakan xml sederhana dan json_encode tidak ada atribut di acara xml.
$xml = simplexml_load_file("states.xml");
echo json_encode($xml);
Jadi saya mencoba menguraikannya secara manual seperti ini.
foreach($xml->children() as $state)
{
$states[]= array('state' => $state->name);
}
echo json_encode($states);
dan output untuk negara {"state":{"0":"Alabama"}}
bukan{"state":"Alabama"}
Apa yang saya lakukan salah?
XML:
<?xml version="1.0" ?>
<states>
<state id="AL">
<name>Alabama</name>
</state>
<state id="AK">
<name>Alaska</name>
</state>
</states>
Keluaran:
[{"state":{"0":"Alabama"}},{"state":{"0":"Alaska"}
var dump:
object(SimpleXMLElement)#1 (1) {
["state"]=>
array(2) {
[0]=>
object(SimpleXMLElement)#3 (2) {
["@attributes"]=>
array(1) {
["id"]=>
string(2) "AL"
}
["name"]=>
string(7) "Alabama"
}
[1]=>
object(SimpleXMLElement)#2 (2) {
["@attributes"]=>
array(1) {
["id"]=>
string(2) "AK"
}
["name"]=>
string(6) "Alaska"
}
}
}
var_dump
berfungsi dengan baik.)Jawaban:
Json & Array dari XML dalam 3 baris:
sumber
<person my-attribute='name'>John</person>
diartikan sebagai<person>John</person>
.@attributes
kunci, sehingga berfungsi dengan sempurna, dan indah. 3 baris pendek kode memecahkan masalah saya dengan indah.<list><item><a>123</a><a>456</a></item><item><a>123</a></item></list>
->{"item":[{"a":["123","456"]},{"a":"123"}]}
. Solusi di php.net oleh ratfactor memecahkan masalah itu dengan selalu menyimpan elemen dalam array.Maaf telah menjawab kiriman lama, tetapi artikel ini menguraikan pendekatan yang relatif singkat, ringkas, dan mudah dikelola. Saya mengujinya sendiri dan bekerja dengan cukup baik.
http://lostechies.com/seanbiefeld/2011/10/21/simple-xml-to-json-with-php/
sumber
Saya menemukan jawabannya. json_encode menangani objek secara berbeda dari string. Saya melemparkan objek ke string dan berfungsi sekarang.
sumber
Saya kira saya agak terlambat ke pesta tetapi saya telah menulis fungsi kecil untuk menyelesaikan tugas ini. Ini juga menangani atribut, konten teks dan bahkan jika beberapa node dengan nama simpul yang sama adalah saudara kandung.
Penafian: Saya bukan orang asli PHP, jadi mohon lakukan kesalahan sederhana.
Contoh penggunaan:
Input Contoh (myfile.xml):
Contoh output:
Cukup dicetak:
Yang perlu diingat: Beberapa tag dengan tagname yang sama dapat berupa saudara kandung. Solusi lain kemungkinan besar akan menjatuhkan semua kecuali saudara terakhir. Untuk menghindari hal ini, setiap simpul tunggal, meskipun hanya memiliki satu anak, adalah larik yang menyimpan objek untuk setiap instance tagname. (Lihat beberapa elemen "" sebagai contoh)
Bahkan elemen root, yang hanya ada satu di dokumen XML yang valid disimpan sebagai array dengan objek instance, hanya untuk memiliki struktur data yang konsisten.
Agar dapat membedakan antara konten simpul XML dan atribut XML, setiap atribut obyek disimpan dalam "$" dan konten pada anak "_".
Sunting: Saya lupa menampilkan output untuk data input contoh Anda
sumber
$xml = simplexml_load_file("myfile.xml",'SimpleXMLElement',LIBXML_NOCDATA);
.Fatal error: Uncaught Error: Call to a member function getName() on bool
.. saya pikir versi php gagal :-( .. tolong bantu!Jebakan yang umum adalah melupakan yang
json_encode()
tidak menghargai elemen dengan nilai teks dan atribut. Ini akan memilih salah satunya, yang berarti dataloss. Fungsi di bawah menyelesaikan masalah itu. Jika seseorang memutuskan untuk menggunakanjson_encode
/decode
way, fungsi berikut disarankan.dengan melakukan itu,
<foo bar="3">Lorem</foo>
tidak akan berakhir seperti{"foo":"Lorem"}
pada JSON Anda.sumber
$dom
? Darimana itu datang?Coba gunakan ini
Atau
Anda dapat menggunakan perpustakaan ini: https://github.com/rentpost/xml2array
sumber
Saya telah menggunakan TypeConverter Miles Johnson untuk tujuan ini. Dapat diinstal menggunakan Komposer .
Anda dapat menulis sesuatu seperti ini dengan menggunakannya:
sumber
Mengoptimalkan jawaban Antonio Max:
sumber
Jika Anda hanya ingin mengonversi bagian tertentu dari XML ke JSON, Anda dapat menggunakan XPath untuk mengambil ini dan mengonversinya menjadi JSON.
Harap dicatat bahwa jika Anda Xpath salah, ini akan mati dengan kesalahan. Jadi, jika Anda men-debug ini melalui panggilan AJAX, saya sarankan Anda juga mencatat badan respons.
sumber
sumber
Solusi terbaik yang berfungsi seperti pesona
Sumber
sumber
Ini merupakan peningkatan dari solusi yang paling banyak dipilih oleh Antonio Max, yang juga bekerja dengan XML yang memiliki ruang nama (dengan mengganti titik dua dengan garis bawah). Ini juga memiliki beberapa opsi tambahan (dan tidak menguraikan
<person my-attribute='name'>John</person>
dengan benar).sumber
<element/>
, gagal untuk mengatasi elemen yang dimulai dengan, atau berisi garis bawah, yang diizinkan dalam XML. Gagal mendeteksi CDATA. Dan seperti yang sudah saya katakan, ini PERLAHAN. Ini adalah kompleksitas O (n ^ 2) karena penguraian dalam.Semua solusi di sini memiliki masalah!
... Ketika representasi memerlukan interpretasi XML yang sempurna (tanpa masalah dengan atribut) dan untuk mereproduksi semua tag-teks-tag-teks-teks -... dan urutan tag. Juga baik diingat di sini bahwa objek JSON "adalah set unordered" (tidak mengulangi kunci dan kunci tidak dapat memiliki urutan yang telah ditentukan) ... Bahkan xml2json ZF salah (!) Karena tidak mempertahankan persis struktur XML.
Semua solusi di sini memiliki masalah dengan XML sederhana ini,
... @FTav solusi tampaknya lebih baik daripada solusi 3-line, tetapi juga memiliki sedikit bug ketika diuji dengan XML ini.
Solusi lama adalah yang terbaik (untuk representasi loss-less)
Solusinya, hari ini dikenal sebagai jsonML , digunakan oleh proyek Zorba dan lainnya, dan pertama kali disajikan pada ~ 2006 atau ~ 2007, oleh (secara terpisah) Stephen McKamey dan John Snelson .
Menghasilkan
Lihat http://jsonML.org atau github.com/mckamey/jsonml . Aturan produksi JSON ini didasarkan pada elemen JSON-analog,
Sintaks ini adalah definisi elemen dan pengulangan, dengan
element-list ::= element ',' element-list | element
.sumber
Setelah meneliti sedikit dari semua jawaban, saya datang dengan solusi yang berfungsi dengan baik dengan fungsi JavaScript saya di seluruh browser (Termasuk konsol / Perangkat Dev):
Ini pada dasarnya membuat DOMDocument baru, memuat dan file XML ke dalamnya dan melintasi setiap node dan anak-anak mendapatkan data / parameter dan mengekspornya ke JSON tanpa tanda "@" yang mengganggu.
Tautan ke file XML .
sumber
Solusi ini menangani ruang nama, atribut, dan menghasilkan hasil yang konsisten dengan elemen berulang (selalu dalam array, bahkan jika hanya ada satu kejadian). Terinspirasi oleh sxiToArray ratfactor () .
Contoh:
sumber
Menemukan jawaban FTav yang paling berguna karena sangat dapat disesuaikan, tetapi fungsi xml2js- nya memiliki beberapa kelemahan. Sebagai contoh, jika elemen anak-anak memiliki tagnames yang sama mereka semua akan disimpan dalam satu objek, ini berarti bahwa urutan elemen tidak akan dipertahankan. Dalam beberapa kasus, kami benar-benar ingin mempertahankan pesanan, jadi sebaiknya kami menyimpan data setiap elemen dalam objek terpisah:
Inilah cara kerjanya. Struktur xml awal:
JSON hasil:
sumber
Sepertinya
$state->name
variabel memegang array. Kamu bisa memakaidi dalam
foreach
untuk menguji itu.Jika itu masalahnya, Anda dapat mengubah garis di dalam
foreach
keuntuk memperbaikinya.
sumber
sumber
Jika Anda pengguna ubuntu, instal xml reader (saya punya php 5.6. Jika Anda punya yang lain, silakan cari paket dan instal)
sumber