PHP kullanarak dinamik olarak XML dosyası nasıl oluşturulur?


233

Çalışma zamanında dinamik olarak bir xml dosyası oluşturmak zorunda. Lütfen aşağıdaki XML dosyasını PHP kullanarak dinamik olarak oluşturmama yardım edin.

<?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
Ayrıca remebmber, xml 1.0 tüm arama motorları tarafından desteklenmez. Size en çok bilinen xml sürümü olduğu için xml 0.9'u öneririm!
Domuta Marcel

PHP ve MySQL Kullanarak XML Dosyası Oluşturun - kvcodes.com/2017/03/generate-xml-file-using-php-mysql
Kvvaradha

1
İyi bir çözüm değildir @Kvvaradha
robertmain

Yanıtlar:


358

SimpleXMLElement kullanırdım .

<?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
Kodlamayı SimpleXml ile belirlemek mümkün müdür? Nasıl yapılabilir?
Eineki

1
Merhaba, ur örnek denedim ama doğrulama 2 uyarıları alıyorum. Nasıl onları temizlemek için? validator.w3.org/…
Satya

3
@Eineki sadece <?xml version="1.0" encoding="WHATEVER_IT_IS"?>işleme talimatı ekleyin . İnanıyorum, SimpleXMLElement doğru şeyi yapacak: tüm sorgulanan dize değerlerini mb_internal_encoding için dönüştürme.
Ivan Krechetov

33
$xml = new SimpleXMLElement("<?xml version=\"1.0\" encoding=\"utf-8\" ?><Person></Person>");
kebyang

Ben 'sütun 6 satır 2 hata: XML bildirimi yalnızca belgenin başında izin verilir'; kod xml başlangıcında ayrıştırma hatasına neden olan ekstra boş satır ekler.
Elia Weiss

179

PHP'de bir XML belgesi oluşturmak için bir DOMDocument sınıfı oluşturmalı, alt düğümler oluşturmalı ve bu düğümleri belge ağacının doğru dalına eklemelisiniz.

Referans için http://it.php.net/manual/en/book.dom.php adresini okuyabilirsiniz.

Şimdi aşağıdaki kodu hızlıca inceleyeceğiz.

  • 2. satırda boş bir xml belgesi oluştururuz (sadece xml sürümünü (1.0) ve kodlamayı (utf8) belirtin)
  • şimdi xml ağacını doldurmamız gerekiyor:
    • Bir xmlnode oluşturmamız gerekiyor (satır 5)
    • ve bunu doğru pozisyona eklemeliyiz. Kökü yaratıyoruz, bu yüzden doğrudan domdocument'e ekliyoruz.
    • Not oluşturma öğesi öğeyi düğüme ekler ve eklenen düğümü döndürür; bu referansı, izleme düğümlerini kök düğüme (bu arada xml olarak adlandırılır) eklemek için kaydederiz.

Bunlar temeller, sadece bir satırda (örneğin 13.) bir düğüm oluşturabilir ve ekleyebilirsiniz, dom api ile başka birçok şey yapabilirsiniz. Sana bağlı.

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

Düzenleme: Sadece bir ipucu: xml yazdırmak yerine bir xmldocument (dom belgesi bir veya simpleksml bir) kullanmanın ana avantajı, xmltree xpath sorgusu ile aranabilir olmasıdır


6
tekrar kullanabilir $domtree->save('mypath/xmlfile.xml');miyim
guitarlass

1
@guitarlass Haklısın. save ve saveXML benzerdir: ilki xmltree dosyasını bir dosyaya, ikincisi bir dizeye (ve normal dosya kaydetme yönergeleriyle sonraki adımda kaydedebilirsiniz).
Eineki

4
@jjonesdesign Tembel olmak için gereken bilgileri elde etmek için çok çalışmalısınız :)
Eineki

1
Örnek, XML öğeleri tarafından kırılmak yerine bir uzun satır oluşturur. $domtree->formatOutput = true;
Çıktıyı güzelleştirmek

1
@Drenyl uygun bir içerik türü üstbilgisi ve a ekleyin Content-Disposition: attachmentve saveXml sonucunu yazdırın. Bir dosya adı da önerebilirsiniz.
Eineki

27

Bunu yapmanın kolay bir yolu:

<?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>';

?>

.php olarak kaydet


18
kolay, ancak köşeli parantez ve "ve" işareti gibi XML metakarakterlerine sahip değişkenler enterpole edildiğinde hatalara yatkın
Matthew Lock


4

Minik Ama Güçlü şablon sistemine bir göz atın . Genellikle HTML'yi ayarlamak için kullanılır, ancak XML dosyalarıyla çalışan bir uzantı vardır. Bunu, bir kod dosyası ve iki şablon dosyası - htm ve xml - alabileceğim raporlar oluşturmak için yaygın olarak kullanıyorum ve kullanıcı daha sonra ekrana veya e-tabloya rapor göndermeyi seçebilir.

Başka bir avantaj, xml'yi sıfırdan kodlamak zorunda değilsiniz, bazı durumlarda çok büyük karmaşık e-tabloları dışa aktarmak istedim ve tüm dışa aktarımı kodlamak yerine, gereken tüm mevcut bir e-tabloyu kaydetmek xml ve veri çıkışının gerekli olduğu kod etiketlerinde kullanın. Çalışmanın hızlı ve etkili bir yoludur.


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

Basitçe sadece veritabanı ile bağlantı proje klasöründe test.xml dosyası yaratacak


26
Bu, asla üretimi görmemesi gereken bir kod türüdür. Çıkardığınız verilere bağlı olarak, geçersiz (örn. Ayrıştırılamaz) XML oluşturabilirsiniz. En iyi ihtimalle özensizdir ve birkaç satır kod kaydedebileceğiniz için kolay görünse de, daha sonra bakım ve hata ayıklama açısından size daha pahalıya mal olacaktır; bir gün işinizin sorumluluğunu üstlenebilecek olan zavallı adamdan bahsetmiyorum bile.
Arne

3
-1 ilk önce bir dizeyi bazı xml istemekle birleştirir, sonra bu dizeyi SimpleXML'ye iter - Bu sadece baş aşağı çevrilmiş gibi görünür. Bunun yerine önce XML kitaplığı nesnesini başlatın, ardından XML'yi oluşturmak için kullanın. Daha kolay, daha az bellek kullanır, daha az hataya eğilimlidir ve XML'yi dosyaya veya stdout'a aktarmanıza izin verir.
hakre

2
Belki de bu cevabı silmenin zamanı geldi (ve kayıp itibarınızı geri alacaksınız!).
Jose Manuel Abarca Rodríguez

Bence kalmalı. İlk kez XML ile çalışırken bazı kodlar yaptım ve biraz böyle görünüyordu, bu yüzden ne YAPILMAMASI görmek çok yararlı oldu.
Peter Højlund Andersen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.