Як динамічно генерувати 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!
Домута Марсель

Створення 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? Як це можна зробити?
Ейнекі

1
Привіт, я спробував приклад ур, але під час перевірки я отримую 2 попередження. як їх очистити? validator.w3.org/…
Satya

3
@Eineki просто додайте <?xml version="1.0" encoding="WHATEVER_IT_IS"?>інструкцію з обробки. Я вірю, SimpleXMLElement зробить правильно: перетворить усі запитувані рядкові значення у ваше mb_internal_encoding.
Іван Кречетов

33
$xml = new SimpleXMLElement("<?xml version=\"1.0\" encoding=\"utf-8\" ?><Person></Person>");
кебян

Я отримую "помилка в другому рядку в стовпці 6: декларація XML дозволена лише на початку документа"; код додає додатковий порожній рядок на початку xml, що викликає помилку розбору.
Елія Вайс

179

Для створення XMLdocument в PHP слід встановити клас DOMDocument, створити дочірні вузли та додати ці вузли у правильній гілці дерева документів.

Для довідки ви можете прочитати http://it.php.net/manual/en/book.dom.php

Тепер ми зробимо короткий огляд коду нижче.

  • у другому рядку ми створюємо порожній XML-документ (просто вкажіть версію xml (1.0) та кодування (utf8))
  • тепер нам потрібно заповнити дерево XML:
    • Ми повинні створити xmlnode (рядок 5)
    • і ми повинні додати це у правильному положенні. Ми створюємо корінь, тому додаємо це безпосередньо до домен.
    • Зверніть увагу на створення елемента, додайте елемент до вузла і поверніть вставлений вузол, ми збережемо це посилання, щоб додати трекові вузли до кореневого вузла (до речі, називається xml).

Це основи, ви можете створити і додати вузол лише в рядку (наприклад, 13-й), ви можете робити багато інших речей з домом 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 у файл, другий - у рядок (і ви можете зберегти його на наступному кроці зі звичайними директивами збереження файлів).
Ейнекі

4
@jjonesdesign Ви повинні наполегливо працювати, щоб отримати знання, необхідні для того, щоб бути лінивим :)
Eineki

1
Приклад генерує один довгий рядок, а не розбиває XML-елементи. Вам потрібно додати, $domtree->formatOutput = true;щоб зробити результат гарним :)
JackTheKnife

1
@Drenyl додайте відповідний заголовок типу вмісту та а Content-Disposition: attachmentта надрукуйте результат saveXml. Ви також можете запропонувати ім'я файлу.
Ейнекі

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
простий, але схильний до помилок, коли змінні інтерполюються, у яких є метахарактеристики 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 .
Даніеле Орландо

4
Зовнішня бібліотека, щоб зробити щось, що легко зробити в рідному PHP за допомогою SimpleXML, не є рішенням.
robertmain

4

Погляньте на крихітну, але сильну систему шаблонів. Зазвичай використовується для шаблонування 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. Це в кращому випадку неохайно, і хоча це може здатися простим, оскільки ви можете зберегти кілька рядків коду, це пізніше обійдеться вам у плані обслуговування та налагодження; не кажучи вже про бідного хлопця, який якогось дня може взяти на себе відповідальність за вашу роботу.
Арн

3
-1 спершу скручуючи рядок з деяким бажанням бути xml, потім натискаючи на рядок у SimpleXML - це виглядає просто перевернуто догори ногами. Замість цього спочатку ініціалізуйте об’єкт бібліотеки XML, а потім використовуйте його для нарощування XML. Це простіше, використовує менше пам’яті, менше схильний до помилок і дозволяє передавати XML у файл або stdout.
хакре

2
Можливо, настав час видалити цю відповідь (і ви отримаєте свою втрачену репутацію!).
Хосе Мануель Абарка Родрігес

Я думаю, що це має залишитися. Я зробив якийсь код сам вперше, працюючи з XML, і це виглядало приблизно так, тому було дуже корисно побачити, що НЕ робити.
Пітер Хейлунд Андерсен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.