Bagaimana cara menghasilkan file XML secara dinamis menggunakan PHP?

233

Saya harus membuat file xml secara dinamis saat runtime. Tolong bantu saya dalam menghasilkan file XML di bawah ini secara dinamis menggunakan PHP.

<?xml version="1.0" encoding="UTF-8"?>
<xml>
 <track>
     <path>song1.mp3</path>
     <title>Track 1 - Track Title</title>
 </track>
 <track>
     <path>song2.mp3</path>
     <title>Track 2 - Track Title</title>
 </track>
 <track>
     <path>song3.mp3</path>
     <title>Track 3 - Track Title</title>
 </track>
 <track>
     <path>song4.mp3</path>
     <title>Track 4 - Track Title</title>
 </track>
 <track>
     <path>song5.mp3</path>
     <title>Track 5 - Track Title</title>
 </track>
 <track>
     <path>song6.mp3</path>
     <title>Track 6 - Track Title</title>
 </track>
 <track>
     <path>song7.mp3</path>
     <title>Track 7 - Track Title</title>
 </track>
 <track>
     <path>song8.mp3</path>
     <title>Track 8 - Track Title</title>
 </track>

musicking123
sumber
1
Pengingat juga, xml 1.0 tidak didukung oleh semua mesin pencari. Saya sarankan Anda xml 0.9 karena merupakan versi xml paling dikenal!
Domuta Marcel
Hasilkan File XML Menggunakan PHP dan MySQL - kvcodes.com/2017/03/generate-xml-file-using-php-mysql
Kvvaradha
1
@Kvvaradha itu bukan solusi yang baik
robertmain

Jawaban:

358

Saya akan menggunakan SimpleXMLElement .

<?php

$xml = new SimpleXMLElement('<xml/>');

for ($i = 1; $i <= 8; ++$i) {
    $track = $xml->addChild('track');
    $track->addChild('path', "song$i.mp3");
    $track->addChild('title', "Track $i - Track Title");
}

Header('Content-type: text/xml');
print($xml->asXML());
Ivan Krechetov
sumber
12
Dimungkinkan untuk menentukan pengkodean dengan SimpleXml? Bagaimana itu bisa dilakukan?
Eineki
1
Hai, saya mencoba contoh Anda tetapi dalam validasi saya mendapatkan 2 peringatan. Bagaimana cara menghapusnya? validator.w3.org/…
Satya
3
@Eineki cukup tambahkan <?xml version="1.0" encoding="WHATEVER_IT_IS"?>instruksi pemrosesan. Saya percaya, SimpleXMLElement akan melakukan hal yang benar: mengonversi semua nilai string yang diminta ke mb_internal_encoding Anda.
Ivan Krechetov
33
$xml = new SimpleXMLElement("<?xml version=\"1.0\" encoding=\"utf-8\" ?><Person></Person>");
kebyang
Saya mendapatkan 'kesalahan pada baris 2 di kolom 6: Deklarasi XML hanya diizinkan di awal dokumen'; kode menambahkan baris kosong ekstra di awal xml yang menyebabkan kesalahan parsing.
Elia Weiss
179

Untuk membuat dokumen XML dalam PHP Anda harus membuat instance kelas DOMDocument, membuat node anak dan menambahkan node ini di cabang yang benar dari pohon dokumen.

Untuk referensi Anda dapat membaca http://it.php.net/manual/en/book.dom.php

Sekarang kita akan melakukan tur singkat dari kode di bawah ini.

  • pada baris 2 kita membuat dokumen xml kosong (cukup tentukan versi xml (1.0) dan penyandian (utf8))
  • sekarang kita perlu mengisi pohon xml:
    • Kita harus membuat xmlnode (baris 5)
    • dan kita harus menambahkan ini di posisi yang benar. Kami sedang membuat root sehingga kami menambahkan ini langsung ke domdocument.
    • Catatan buat elemen, tambahkan elemen ke node dan kembalikan node yang dimasukkan, kami menyimpan referensi ini untuk menambahkan track track ke root node (kebetulan bernama xml).

Ini adalah dasar-dasarnya, Anda dapat membuat dan menambahkan node hanya dalam satu baris (13, misalnya), Anda dapat melakukan banyak hal lain dengan dom api. Ini terserah kamu.

<?php    
    /* create a dom document with encoding utf8 */
    $domtree = new DOMDocument('1.0', 'UTF-8');

    /* create the root element of the xml tree */
    $xmlRoot = $domtree->createElement("xml");
    /* append it to the document created */
    $xmlRoot = $domtree->appendChild($xmlRoot);

    $currentTrack = $domtree->createElement("track");
    $currentTrack = $xmlRoot->appendChild($currentTrack);

    /* you should enclose the following two lines in a cicle */
    $currentTrack->appendChild($domtree->createElement('path','song1.mp3'));
    $currentTrack->appendChild($domtree->createElement('title','title of song1.mp3'));

    $currentTrack->appendChild($domtree->createElement('path','song2.mp3'));
    $currentTrack->appendChild($domtree->createElement('title','title of song2.mp3'));

    /* get the xml printed */
    echo $domtree->saveXML();
?>

Sunting: Hanya satu petunjuk lain: Keuntungan utama menggunakan xmldocument (dokumen dom atau simplexml) daripada mencetak xml, adalah bahwa xmltree dapat dicari dengan xpath query

Eineki
sumber
6
Bisakah saya menggunakan lagi $domtree->save('mypath/xmlfile.xml');?
guitarlass
1
@guitarlass Anda benar. save dan saveXML serupa: yang pertama membuang xmltree ke dalam file, yang kedua ke dalam string (dan Anda dapat menyimpannya dalam langkah berikut dengan arahan penyimpanan file yang normal).
Eineki
4
@jjonesdesign Anda harus bekerja keras untuk mendapatkan pengetahuan yang diperlukan untuk menjadi malas :)
Eineki
1
Contoh menghasilkan satu garis panjang alih-alih dipecah oleh elemen XML. Anda perlu menambahkan $domtree->formatOutput = true;untuk membuat output cantik :)
JackTheKnife
1
@Renyl menambahkan header tipe konten yang sesuai dan a Content-Disposition: attachmentdan mencetak hasil saveXml. Anda juga dapat menyarankan nama file.
Eineki
27

Cara yang mudah rusak untuk melakukan ini adalah:

<?php
// Send the headers
header('Content-type: text/xml');
header('Pragma: public');
header('Cache-control: private');
header('Expires: -1');
echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>";

echo '<xml>';

// echo some dynamically generated content here
/*
<track>
    <path>song_path</path>
    <title>track_number - track_title</title>
</track>
*/

echo '</xml>';

?>

simpan sebagai .php

andyk
sumber
18
mudah, tetapi rentan terhadap kesalahan ketika variabel diinterpolasi yang memiliki karakter XML di dalamnya seperti kurung sudut dan ampersand
Matthew Lock
15

Dengan FluidXML Anda dapat menghasilkan XML dengan sangat mudah.

$tracks = fluidxml('xml');

$tracks->times(8, function ($i) {
    $this->add([
        'track' => [
            'path'  => "song{$i}.mp3",
            'title' => "Track {$i} - Track Title"
        ]
    ]);

});

https://github.com/servo-php/fluidxml

Daniele Orlando
sumber
2
FluidXML dalam rilis terakhir mendukung PHP 5 .
Daniele Orlando
4
Pustaka eksternal untuk melakukan sesuatu yang dapat dengan mudah dilakukan dalam PHP asli dengan SimpleXML bukanlah solusi.
robertmain
4

Lihatlah sistem templating Tiny But Strong . Ini umumnya digunakan untuk templating HTML tetapi ada ekstensi yang berfungsi dengan file XML. Saya menggunakan ini secara luas untuk membuat laporan di mana saya dapat memiliki satu file kode dan dua file template - htm dan xml - dan pengguna kemudian dapat memilih apakah akan mengirim laporan ke layar atau spreadsheet.

Keuntungan lain adalah Anda tidak perlu kode xml dari awal, dalam beberapa kasus saya sudah ingin mengekspor spreadsheet sangat besar kompleks, dan bukannya harus kode semua ekspor semua yang diperlukan adalah untuk menyimpan spreadsheet yang ada di xml dan gantikan tag kode di mana output data diperlukan. Ini cara cepat dan sangat efisien untuk bekerja.

Cruachan
sumber
-14
$query=mysql_query("select * from tablename")or die(mysql_error()); 
$xml="<libraray>\n\t\t";
while($data=mysql_fetch_array($query))
{

    $xml .="<mail_address>\n\t\t";
    $xml .= "<id>".$data['id']."</id>\n\t\t";
    $xml .= "<email>".$data['email_address']."</email>\n\t\t";
    $xml .= "<verify_code>".$data['verify']."</verify_code>\n\t\t";
    $xml .= "<status>".$data['status']."</status>\n\t\t";
    $xml.="</mail_address>\n\t";
}
$xml.="</libraray>\n\r";
$xmlobj=new SimpleXMLElement($xml);
$xmlobj->asXML("text.xml");

Sederhana saja terhubung dengan database Anda itu akan membuat file test.xml di folder proyek Anda

pratik
sumber
26
Ini adalah jenis kode yang seharusnya tidak pernah melihat produksi. Bergantung pada data yang Anda ouput, Anda dapat membuat XML yang tidak valid (mis. Tidak dapat dipecahkan). Ceroboh di terbaik, dan meskipun mungkin tampak mudah karena Anda dapat menyimpan beberapa baris kode, itu akan dikenakan biaya lebih banyak nanti dalam hal pemeliharaan dan debugging; belum lagi pria malang yang suatu hari nanti mungkin mengambil alih tanggung jawab pekerjaan Anda.
Arne
3
-1 pertama-tama menggabungkan string dengan beberapa calon-xml, kemudian mendorong string itu ke SimpleXML - Ini terlihat terbalik terbalik. Alih-alih, pertama-tama inisialisasi objek perpustakaan XML, kemudian gunakan untuk membangun XML. Lebih mudah, menggunakan lebih sedikit memori, lebih sedikit rawan kesalahan dan memungkinkan Anda untuk streaming XML ke file atau stdout.
hakre
2
Mungkin sudah waktunya untuk menghapus jawaban ini (dan Anda akan mendapatkan kembali reputasi Anda yang hilang!).
Jose Manuel Abarca Rodríguez
Saya pikir itu harus tetap. Saya membuat beberapa kode sendiri pertama kali bekerja dengan XML dan terlihat sedikit seperti ini, jadi sangat membantu untuk melihat apa yang TIDAK boleh dilakukan.
Peter Højlund Andersen