วิธีสร้างไฟล์ XML แบบไดนามิกโดยใช้ PHP


233

ฉันต้องสร้างไฟล์ xml แบบไดนามิกตอนรันไทม์ โปรดช่วยฉันในการสร้างไฟล์ XML ด้านล่างแบบไดนามิกโดยใช้ 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
นอกจากนี้เมื่อถึงเดือนธันวาคมเครื่องมือค้นหาทั้งหมดไม่รองรับ xml 1.0 ฉันแนะนำคุณ xml 0.9 เพราะเป็นเวอร์ชัน xml ที่รู้จักมากที่สุด!
Domuta Marcel

สร้างไฟล์ XML ใช้ PHP และ MySQL - kvcodes.com/2017/03/generate-xml-file-using-php-mysql
Kvvaradha

1
@Kvvaradha ที่ไม่ได้เป็นทางออกที่ดี
robertmain

คำตอบ:


358

ฉันต้องการใช้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
เป็นไปได้หรือไม่ที่จะระบุการเข้ารหัสด้วย SimpleXml? สามารถทำได้อย่างไร?
Eineki

1
สวัสดีฉันลองตัวอย่าง แต่ในการตรวจสอบฉันได้รับ 2 คำเตือนวิธีล้างพวกเขา validator.w3.org/…
Satya

3
@Eineki เพียงเพิ่ม<?xml version="1.0" encoding="WHATEVER_IT_IS"?>คำสั่งการประมวลผล ฉันเชื่อว่า SimpleXMLElement จะทำในสิ่งที่ถูกต้อง: แปลงค่าสตริงที่สอบถามทั้งหมดเป็น mb_internal_encoding ของคุณ
Ivan Krechetov

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

ฉันได้รับ 'ข้อผิดพลาดในบรรทัดที่ 2 ที่คอลัมน์ 6: การประกาศ XML อนุญาตเฉพาะตอนเริ่มต้นเอกสาร'; รหัสเพิ่มบรรทัดว่างพิเศษที่จุดเริ่มต้นของ xml ซึ่งทำให้เกิดข้อผิดพลาดในการแยกวิเคราะห์
Elia Weiss

179

ในการสร้าง XMLdocument ใน PHP คุณควรอินสแตนซ์คลาส DOMDocument สร้างโหนดลูกและผนวกโหนดเหล่านี้ในสาขาที่ถูกต้องของทรีเอกสาร

สำหรับการอ้างอิงคุณสามารถอ่านhttp://it.php.net/manual/en/book.dom.php

ตอนนี้เราจะทัวร์ชมโค้ดด้านล่างอย่างรวดเร็ว

  • ที่บรรทัด 2 เราสร้างเอกสาร xml ที่ว่างเปล่า (เพียงระบุเวอร์ชัน xml (1.0) และการเข้ารหัส (utf8))
  • ตอนนี้เราต้องเติมต้นไม้ xml:
    • เราต้องสร้าง xmlnode (บรรทัดที่ 5)
    • และเราต้องต่อท้ายสิ่งนี้ในตำแหน่งที่ถูกต้อง เรากำลังสร้างรูทดังนั้นเราจึงเพิ่มสิ่งนี้ลงในเอกสารโดยตรง
    • หมายเหตุสร้างองค์ประกอบต่อท้ายองค์ประกอบไปยังโหนดและคืนค่าแทรกโหนดเราบันทึกการอ้างอิงนี้เพื่อผนวกโหนดติดตามไปยังโหนดราก (บังเอิญเรียกว่า xml)

นี่คือพื้นฐานที่คุณสามารถสร้างและผนวกโหนดในหนึ่งบรรทัด (ตัวอย่างที่ 13) คุณสามารถทำสิ่งอื่น ๆ ได้อีกมากมายด้วย dom api มันขึ้นอยู่กับคุณ.

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

แก้ไข: อีกหนึ่งคำใบ้: ประโยชน์หลักของการใช้ xmldocument (เอกสาร dom หนึ่งหรือ simplexml หนึ่ง) แทนที่จะพิมพ์ xml คือการที่ xmltree สามารถค้นหาได้ด้วยแบบสอบถาม xpath


6
ฉันสามารถใช้อีกครั้งได้$domtree->save('mypath/xmlfile.xml');ไหม
กีต้าร์

1
@guitarlass คุณพูดถูก saveและsaveXMLคล้ายกัน: แรกถ่ายโอนข้อมูล xmltree ลงในไฟล์ที่สองลงในสตริง (และคุณสามารถบันทึกในขั้นตอนต่อไปด้วยคำสั่งการบันทึกไฟล์ปกติ)
Eineki

4
@jjonesdesign คุณต้องทำงานอย่างหนักเพื่อให้ได้รับความรู้ที่จำเป็นที่จะขี้เกียจ :)
Eineki

1
ตัวอย่างสร้างหนึ่งบรรทัดยาวแทนการแบ่งโดยองค์ประกอบ XML คุณจำเป็นต้องเพิ่ม$domtree->formatOutput = true;เพื่อทำให้ผลลัพธ์ออกมาสวย :)
JackTheKnife

1
@Drenyl เพิ่มส่วนหัวประเภทเนื้อหาที่เหมาะสมและ a Content-Disposition: attachmentและพิมพ์ผลลัพธ์ saveXml คุณสามารถแนะนำชื่อไฟล์ได้
Eineki

27

วิธีที่ง่ายในการทำเช่นนี้คือ:

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


18
ง่าย แต่มีแนวโน้มที่จะเกิดข้อผิดพลาดเมื่อมีการแก้ไขตัวแปรที่มี metacharacters XML ในนั้นเช่นวงเล็บมุมและเครื่องหมายแอมเปอร์แซนด์
Matthew Lock

15

ด้วยFluidXMLคุณสามารถสร้าง XML ได้อย่างง่ายดาย

$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 ในรุ่นที่ผ่านมาสนับสนุนPHP 5
Daniele Orlando

4
ไลบรารี่ภายนอกที่จะทำอะไรบางอย่างที่สามารถทำได้ง่าย ๆ ในภาษา PHP ด้วย SimpleXML ไม่ใช่วิธีแก้ปัญหา
robertmain

4

ลองดูระบบ templating ของTiny But Strong โดยทั่วไปจะใช้สำหรับการสร้างเทมเพลต HTML แต่มีส่วนขยายที่ทำงานกับไฟล์ XML ได้ ฉันใช้สิ่งนี้อย่างกว้างขวางในการสร้างรายงานที่ฉันสามารถมีไฟล์รหัสหนึ่งไฟล์และไฟล์เทมเพลตสองไฟล์ - htm และ xml - จากนั้นผู้ใช้สามารถเลือกว่าจะส่งรายงานไปยังหน้าจอหรือสเปรดชีต

ข้อดีอีกอย่างคือคุณไม่ต้องเขียนโค้ด xml ตั้งแต่เริ่มต้นในบางกรณีฉันต้องการส่งออกสเปรดชีตที่ซับซ้อนมาก ๆ และแทนที่จะต้องส่งโค้ดการส่งออกทั้งหมดที่จำเป็นต้องมีก็คือบันทึกสเปรดชีตที่มีอยู่ใน xml และแทนที่ในแท็กรหัสที่จำเป็นต้องใช้ข้อมูลออก มันเป็นวิธีที่รวดเร็วและมีประสิทธิภาพในการทำงาน


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

มันง่ายเพียงแค่เชื่อมต่อกับฐานข้อมูลของคุณมันจะสร้างไฟล์ test.xml ในโฟลเดอร์โครงการของคุณ


26
นี่คือรหัสชนิดที่ไม่ควรเห็นว่าใช้งานจริง คุณอาจสร้าง XML ที่ไม่ถูกต้อง (เช่นไม่สามารถค้นหาได้) ทั้งนี้ขึ้นอยู่กับข้อมูลที่คุณป้อน มันเลอะเทอะที่สุดและแม้ว่ามันอาจดูง่ายเพราะคุณอาจบันทึกโค้ดไม่กี่บรรทัด แต่จะทำให้คุณเสียค่าใช้จ่ายมากกว่าในด้านการบำรุงรักษาและการดีบัก ไม่พูดถึงคนที่น่าสงสารซึ่งบางวันอาจรับผิดชอบงานของคุณ
Arne

3
-1 ก่อนเชื่อมโยงสตริงที่มีบางสิ่งที่ต้องการเป็น xml จากนั้นกดสตริงนั้นลงใน SimpleXML - นี่ดูเหมือนจะพลิกกลับหัว แต่แรกเริ่มต้นวัตถุห้องสมุด XML ให้แล้วใช้มันในการสร้างขึ้นของ XML ง่ายกว่าใช้หน่วยความจำน้อยกว่ามีข้อผิดพลาดน้อยและช่วยให้คุณสามารถสตรีม XML ไปยังไฟล์หรือ stdout ได้
hakre

2
อาจถึงเวลาที่จะลบคำตอบนี้ (และคุณจะได้รับชื่อเสียงที่หายไป!)
Jose Manuel Abarca Rodríguez

ฉันคิดว่ามันควรจะอยู่ ฉันสร้างโค้ดด้วยตัวเองเป็นครั้งแรกที่ทำงานกับ XML และมันก็เป็นแบบนี้ดังนั้นมันจึงมีประโยชน์มากที่จะเห็นสิ่งที่ไม่ควรทำ
Peter Højlund Andersen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.