【问题标题】:How to generate XML file dynamically using PHP?如何使用 PHP 动态生成 XML 文件?
【发布时间】:2010-10-03 23:01:09
【问题描述】:

我必须在运行时动态生成一个 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>

【问题讨论】:

  • 另外请记住,并非所有搜索引擎都支持 xml 1.0。我推荐你 xml 0.9,因为它是最知名的 xml 版本!
  • 使用 PHP 和 MySQL 生成 XML 文件 - kvcodes.com/2017/03/generate-xml-file-using-php-mysql
  • @Kvvaradha 这不是一个好的解决方案

标签: php xml


【解决方案1】:

一个容易破坏的方法是:

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

【讨论】:

  • 简单,但在插入包含 XML 元字符(如尖括号和 & 符号)的变量时容易出错
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    我会使用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());
    
    ?>
    

    $xml-&gt;asXML() 也可以将文件名作为参数保存到该文件中

    【讨论】:

    • 可以用SimpleXml指定编码吗?怎么做?
    • 嗨,我试过你的例子,但在验证中我收到 2 个警告。如何清除它们? validator.w3.org/…
    • @Eineki 只需添加&lt;?xml version="1.0" encoding="WHATEVER_IT_IS"?&gt; 处理指令。我相信,SimpleXMLElement 会做正确的事:将所有查询的字符串值转换为您的 mb_internal_encoding。
    • $xml = new SimpleXMLElement("&lt;?xml version=\"1.0\" encoding=\"utf-8\" ?&gt;&lt;Person&gt;&lt;/Person&gt;");
    • 由于某种原因这对我不起作用,不会创建 xml 文件。下面的答案奏效了。
    【解决方案4】:

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

    参考你可以阅读http://it.php.net/manual/en/book.dom.php

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

    • 在第 2 行,我们创建了一个空的 xml 文档 (只需指定 xml 版本(1.0)和编码(utf8))
    • 现在我们需要填充 xml 树:
      • 我们必须创建一个 xmlnode(第 5 行)
      • 我们必须将它附加到正确的位置。我们正在创建根,因此我们将其直接附加到 domdocument。
      • 注意create element将元素追加到节点并返回插入的节点,我们保存这个引用来追加轨道节点到根节点(顺便称为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);
    
    
    
        /* 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();
    ?>
    

    编辑: 还有一个提示: 使用 xml 文档(dom 文档或 simplexml 文档)而不是打印 xml 的主要优点是 xmltree 可以使用 xpath 查询进行搜索

    【讨论】:

    • 我可以再次使用$domtree-&gt;save('mypath/xmlfile.xml'); 吗?
    • @guitarlass 你是对的。 savesaveXML 相似:第一个将 xmltree 转储到文件中,第二个转储到字符串中(您可以在后续步骤中使用普通文件保存指令将其保存)。
    • @jjonesdesign 你必须努力学习才能获得懒惰的知识:)
    • 示例生成一长行而不是由 XML 元素中断。您需要添加 $domtree-&gt;formatOutput = true; 以使输出漂亮:)
    • @Drenyl 添加适当的内容类型标题和Content-Disposition: attachment 并打印 saveXml 结果。您还可以建议一个文件名。
    【解决方案5】:
    $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 文件

    【讨论】:

    • 这是一种永远不应该看到生产的代码。根据您输出的数据,您可能会创建无效(即不可解析)的 XML。它充其量是草率的,尽管它可能看起来很容易,因为您可以节省几行代码,但在维护和调试方面会花费您更多的成本;更不用说有一天可能会接管你工作的那个可怜的家伙。
    • -1 首先将一个字符串与一些想要的 xml 连接起来,然后将该字符串推入 SimpleXML - 这看起来只是颠倒了。而是首先 初始化XML 库对象,然后 使用它来构建XML。它更容易,使用更少的内存,更不容易出错,并且允许您将 XML 流式传输到文件或标准输出。
    • 也许是时候删除这个答案了(你会找回失去的声誉!)。
    • 我认为它应该保留。我第一次使用 XML 时自己编写了一些代码,它看起来有点像这样,所以看看什么不该做是非常有帮助的。
    【解决方案6】:

    使用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

    【讨论】:

    • 最新版本中的 FluidXML 支持 PHP 5
    • 一个外部库来做一些可以在原生 PHP 中使用 SimpleXML 轻松完成的事情不是解决方案。
    【解决方案7】:

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

    请记住,根据我所做的测试,DOM 和 SimpleXML 几乎都比 XMLWriter 慢两倍,对于较大的文件,您应该考虑使用后者。

    这是一个完整的工作示例,清晰简单,符合要求,用 XMLWriter 编写(我相信它会帮助其他用户):

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

    【讨论】:

      【解决方案8】:

      希望此代码可以帮助您。简单易行的解决方案

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

      欲了解更多信息,请访问此处以获取详细信息:https://www.guru99.com/php-and-xml.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-04
        • 1970-01-01
        • 1970-01-01
        • 2015-01-12
        • 2012-05-21
        • 1970-01-01
        相关资源
        最近更新 更多