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

如何使用PHP动态生成XML文件?,php,xml,Php,Xml,我必须在运行时动态生成一个xml文件。请帮助我使用PHP动态生成下面的XML文件 <?xml version="1.0" encoding="UTF-8"?> <xml> <track> <path>song1.mp3</path> <title>Track 1 - Track Title</title> </track> <track> <pat

我必须在运行时动态生成一个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.mp3
曲目1-曲目标题
歌曲2.mp3
曲目2-曲目标题
歌曲3.mp3
曲目3-曲目标题
歌曲4.mp3
曲目4-曲目标题
歌曲5.mp3
曲目5-曲目标题
歌曲6.mp3
曲目6-曲目标题
歌曲7.mp3
曲目7-曲目标题
歌曲8.mp3
曲目8-曲目标题

一种容易打破的方法是:

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

看看模板系统。它通常用于模板化HTML,但有一个扩展可用于XML文件。我广泛使用它来创建报告,其中我可以有一个代码文件和两个模板文件(htm和xml),然后用户可以选择是将报告发送到屏幕还是电子表格

另一个优点是您不必从头开始编写xml代码,在某些情况下,我一直希望导出非常大的复杂电子表格,而不必编写所有导出代码,所需的只是将现有电子表格保存为xml,并在需要数据输出的地方替换为代码标记。这是一种快速而高效的工作方式。

我会使用

addChild('path',“song$i.mp3”);
$track->addChild('title',“track$i-track title”);
}
标题('Content-type:text/xml');
打印($xml->asXML());
?>

$xml->asXML()

作为参考,你可以阅读

现在我们将快速浏览下面的代码

  • 在第2行,我们创建了一个空的xml文档 (只需指定xml版本(1.0)和编码(utf8))
  • 现在我们需要填充xml树:
    • 我们必须创建一个xmlnode(第5行)
    • 我们必须把它附加在正确的位置。我们正在创建根,因此我们将其直接附加到domdocument
    • 注意create元素将元素附加到节点并返回插入的节点,我们保存此引用以将跟踪节点附加到根节点(顺便称为xml)
这些是基础,您可以在一行中创建和附加一个节点(例如,第13行),您可以使用domapi做很多其他事情。这取决于你

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



    /* you should enclose the following lines in a cicle */
    $currentTrack = $domtree->createElement("track");
    $currentTrack = $xmlRoot->appendChild($currentTrack);
    $currentTrack->appendChild($domtree->createElement('path','song1.mp3'));
    $currentTrack->appendChild($domtree->createElement('title','title of song1.mp3'));

    $currentTrack = $domtree->createElement("track");
    $currentTrack = $xmlRoot->appendChild($currentTrack);
    $currentTrack->appendChild($domtree->createElement('path','song2.mp3'));
    $currentTrack->appendChild($domtree->createElement('title','title of song2.mp3'));

    /* get the xml printed */
    echo $domtree->saveXML();
?>
createElement(“xml”);
/*将其附加到创建的文档中*/
$xmlRoot=$domtree->appendChild($xmlRoot);
/*你应该把下列几行用圆圈括起来*/
$currentTrack=$domtree->createElement(“track”);
$currentTrack=$xmlRoot->appendChild($currentTrack);
$currentTrack->appendChild($domtree->createElement('path','song1.mp3');
$currentTrack->appendChild($domtree->createElement('title','title of song1.mp3');
$currentTrack=$domtree->createElement(“track”);
$currentTrack=$xmlRoot->appendChild($currentTrack);
$currentTrack->appendChild($domtree->createElement('path','song2.mp3');
$currentTrack->appendChild($domtree->createElement('title','title of song2.mp3');
/*打印xml*/
echo$domtree->saveXML();
?>
编辑: 还有一个提示: 使用xmldocument(dom document one或simplexml one)而不是打印xml的主要优点是,xmltree可以通过xpath查询(xpath query)或die(mysql\u error())进行搜索;
$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");
$xml=“\n\t\t”; while($data=mysql\u fetch\u数组($query)) { $xml.=“\n\t\t”; $xml.=''.$data['id'].“\n\t\t”; $xml.=''.$data['email\u address'].“\n\t\t”; $xml.=''.$data['verify'].“\n\t\t”; $xml.=''.$data['status']。“\n\t\t”; $xml.=“\n\t”; } $xml.=“\n\r”; $xmlobj=新的simplexmlement($xml); $xmlobj->asXML(“text.xml”);
它很简单,只需连接数据库即可在项目文件夹中创建test.xml文件

,您可以非常轻松地生成xml

$tracks = fluidxml('xml');

$tracks->times(8, function ($i) {
    $this->add([
        'track' => [
            'path'  => "song{$i}.mp3",
            'title' => "Track {$i} - Track Title"
        ]
    ]);

});

我看到了DOM和SimpleXML的示例,但没有看到XMLWriter的示例

请记住,从我所做的测试中,DOM和SimpleXML都是XMLIVER的两倍慢,对于更大的文件,您应该考虑使用后一种。 下面是一个完整的工作示例,清晰简单,符合要求,使用XMLWriter编写(我相信它将帮助其他用户):


希望这段代码可以帮助你。简易解决方案

$dom = new DOMDocument();
$dom->encoding = 'utf-8';
$dom->xmlVersion = '1.0';
$dom->formatOutput = true;
$xml_file_name = './movies_list.xml'; //You can give your path to save file.
$root = $dom->createElement('Movies');
    $movie_node = $dom->createElement('movie');
    $attr_movie_id = new DOMAttr('movie_id', '5467');
    $movie_node->setAttributeNode($attr_movie_id);
        
        $child_node_title = $dom->createElement('Title', 'The Campaign');
        $movie_node->appendChild($child_node_title);
        
        $child_node_year = $dom->createElement('Year', 2012);
        $movie_node->appendChild($child_node_year);
        
        $child_node_genre = $dom->createElement('Genre', 'The Campaign');
        $movie_node->appendChild($child_node_genre);
        
        $child_node_ratings = $dom->createElement('Ratings', 6.2);
        $movie_node->appendChild($child_node_ratings);
    $root->appendChild($movie_node);
$dom->appendChild($root);
$dom->save($xml_file_name);

有关更多信息,请访问此处以获取详细信息:

是否可以使用SimpleXml指定编码?如何做到这一点?嗨,我尝试了你的例子,但在验证中我得到了2个警告。如何清除它们@只需添加
处理指令即可。我相信SimpleXMLElement会做正确的事情:将所有查询的字符串值转换为mb_internal_编码我得到“第6列第2行出错:仅允许在文档开头使用XML声明”;代码在xml的开头添加了额外的空行,这会导致解析错误。这很简单,但在插入包含xml元字符的变量(如尖括号和符号)时容易出错。我再次使用
$domtree->save('mypath/xmlfile.xml')?@guitarlass你说得对。和类似:第一个将xmltree转储到一个文件中,第二个转储到一个字符串中(您可以使用正常的文件保存指令在下面的步骤中保存它)。@jjonesdesign您必须努力工作才能获得懒惰所需的知识:)示例生成一条长线,而不是按XML元素打断。您需要添加
$domtree->formatOutput=true
使输出变得漂亮:)@Drenyl添加适当的内容类型标题和
内容处置:附件// array with the key / value pairs of the information to be added (can be an array with the data fetched from db as well)
$songs = [
    'song1.mp3' => 'Track 1 - Track Title',
    'song2.mp3' => 'Track 2 - Track Title',
    'song3.mp3' => 'Track 3 - Track Title',
    'song4.mp3' => 'Track 4 - Track Title',
    'song5.mp3' => 'Track 5 - Track Title',
    'song6.mp3' => 'Track 6 - Track Title',
    'song7.mp3' => 'Track 7 - Track Title',
    'song8.mp3' => 'Track 8 - Track Title',
];

$xml = new XMLWriter();
$xml->openURI('songs.xml');
$xml->setIndent(true);
$xml->setIndentString('    ');
$xml->startDocument('1.0', 'UTF-8');
    $xml->startElement('xml');
            foreach($songs as $song => $track){
                $xml->startElement('track');
                    $xml->writeElement('path', $song);
                    $xml->writeElement('title', $track);
                $xml->endElement();
            }
    $xml->endElement();
$xml->endDocument();
$xml->flush();
unset($xml);
$dom = new DOMDocument();
$dom->encoding = 'utf-8';
$dom->xmlVersion = '1.0';
$dom->formatOutput = true;
$xml_file_name = './movies_list.xml'; //You can give your path to save file.
$root = $dom->createElement('Movies');
    $movie_node = $dom->createElement('movie');
    $attr_movie_id = new DOMAttr('movie_id', '5467');
    $movie_node->setAttributeNode($attr_movie_id);
        
        $child_node_title = $dom->createElement('Title', 'The Campaign');
        $movie_node->appendChild($child_node_title);
        
        $child_node_year = $dom->createElement('Year', 2012);
        $movie_node->appendChild($child_node_year);
        
        $child_node_genre = $dom->createElement('Genre', 'The Campaign');
        $movie_node->appendChild($child_node_genre);
        
        $child_node_ratings = $dom->createElement('Ratings', 6.2);
        $movie_node->appendChild($child_node_ratings);
    $root->appendChild($movie_node);
$dom->appendChild($root);
$dom->save($xml_file_name);