如何使用PHP动态生成XML文件?


233

我必须在运行时动态生成xml文件。请帮助我使用PHP动态生成以下XML文件。

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


1
@Kvvaradha并不是一个很好的解决方案
robertmain

Answers:


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 2013年

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

我在第6列的第2行收到错误:仅在文档开始处允许XML声明”;该代码在xml的开头添加了额外的空行,从而导致解析错误。
Elia Weiss

179

要在PHP中创建XMLdocument,您应该实例化DOMDocument类,创建子节点,并将这些节点附加到文档树的正确分支中。

作为参考,您可以阅读http://it.php.net/manual/en/book.dom.php

现在,我们将快速浏览以下代码。

  • 在第2行,我们创建一个空的xml文档(只需指定xml版本(1.0)和编码(utf8))
  • 现在我们需要填充xml树:
    • 我们必须创建一个xmlnode(第5行)
    • 我们必须将其附加在正确的位置。我们正在创建根目录,因此我们将其直接附加到domdocument中。
    • 注意create元素将元素附加到节点并返回插入的节点,我们保存此引用以将track节点附加到根节点(顺便称为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的主要优点是可以使用xpath查询来搜索xmltree。


6
我可以再次使用$domtree->save('mypath/xmlfile.xml');吗?
guitarlass 2012年

1
@guitarlass你是对的。savesaveXML相似:第一个将xmltree转储到文件中,第二个转储到字符串中(您可以在下一步中使用常规文件保存指令将其保存)。
Eineki 2012年

4
@jjonesdesign您必须努力工作以获得懒惰所需的知识:)
Eineki 2015年

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
容易,但在插补其中包含XML元字符(例如尖括号和&符)的变量时容易出错
Matthew Lock


4

看看Tiny但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 2014年

3
-1首先用一些wanna-be-xml封装一个字符串,然后将该字符串推入SimpleXML-这看起来像是倒过来的。相反,首先初始化XML库对象,然后使用它来构建XML。它更容易,使用更少的内存,更不易出错,并允许您将XML流式传输到文件或标准输出。
hakre 2014年

2
也许是时候删除此答案了(您将恢复失去的声誉!)。
世纪

我认为应该保留。我自己第一次使用XML编写了一些代码,看起来有点像这样,因此了解不执行操作非常有帮助。
PeterHøjlundAndersen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.