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>


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());

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


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


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


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.


-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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.