Как динамически генерировать 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>

musicking123
источник
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? Как это можно сделать?
Eineki
1
Привет, я попробовал ваш пример, но в проверке я получаю 2 предупреждения. Как их очистить? validator.w3.org/…
Сатья
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>");
Kebyang
Я получаю сообщение «Ошибка в строке 2 в столбце 6: объявление XML разрешено только в начале документа»; код добавляет дополнительную пустую строку в начале xml, что вызывает ошибку синтаксического анализа.
Элия ​​Вайс
179

Чтобы создать XML-документ в PHP, вы должны создать экземпляр класса DOMDocument, создать дочерние узлы и добавить эти узлы в правильную ветвь дерева документа.

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

Теперь мы кратко рассмотрим код ниже.

  • в строке 2 мы создаем пустой XML-документ (просто укажите версию XML (1.0) и кодировку (utf8))
  • Теперь нам нужно заполнить дерево XML:
    • Мы должны создать xmlnode (строка 5)
    • и мы должны добавить это в правильном положении. Мы создаем корень, поэтому добавляем его непосредственно в документ.
    • Обратите внимание, что элемент create добавляет элемент к узлу и возвращает вставленный узел. Мы сохраняем эту ссылку, чтобы добавить узлы дорожек к корневому узлу (который также называется 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, состоит в том, что дерево xml доступно для поиска с помощью запроса xpath

Eineki
источник
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

AndyK
источник
18
легко, но подвержено ошибкам, когда интерполируются переменные, в которых есть метасимволы XML, такие как угловые скобки и амперсанды
Мэтью Лок
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, не является решением.
Робертмайн
4

Взгляните на Крошечного, Но Сильного систему шаблонов. Обычно он используется для создания шаблонов HTML, но есть расширение, которое работает с файлами XML. Я широко использую это для создания отчетов, где у меня может быть один файл кода и два файла шаблона - htm и xml - и пользователь затем может выбрать, отправлять ли отчет на экран или в электронную таблицу.

Еще одним преимуществом является то, что вам не нужно кодировать XML с нуля, в некоторых случаях я хотел экспортировать очень большие сложные таблицы, и вместо того, чтобы кодировать весь экспорт, все, что требуется, это сохранить существующую таблицу в XML и подставьте в теги кода, где требуется вывод данных. Это быстрый и очень эффективный способ работы.

Cruachan
источник
-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 в папке вашего проекта.

Pratik
источник
26
Это тот код, который никогда не должен появляться на производстве. В зависимости от данных, которые вы выводите, вы можете создать недопустимый (то есть не разбираемый) XML. Это в лучшем случае небрежно, и хотя это может показаться простым, потому что вы можете сохранить несколько строк кода, это будет стоить вам позже в плане обслуживания и отладки; не говоря уже о бедняге, который однажды может взять на себя ответственность за вашу работу.
Арне
3
-1 сначала объединяем строку с некоторым wanna-be-xml, затем помещаем эту строку в SimpleXML - это выглядит просто перевернутым с ног на голову. Вместо этого сначала инициализируйте объект библиотеки XML, а затем используйте его для создания XML. Это проще, использует меньше памяти, меньше подвержено ошибкам и позволяет передавать поток XML в файл или стандартный вывод.
Хакре
2
Возможно, пришло время удалить этот ответ (и вы вернете свою потерянную репутацию!).
Жозе Мануэль Абарка Родригес
Я думаю, что это должно остаться. Я сам в первый раз сделал код, работая с XML, и это выглядело примерно так, поэтому было очень полезно увидеть, что НЕ нужно делать.
Питер Хейлунд Андерсен