【问题标题】:how do i output an xml file using php我如何使用php输出一个xml文件
【发布时间】:2014-03-11 19:36:18
【问题描述】:

我的网站上有一个 MySQL 数据库,我想知道如何通过 PHP 获取表格中以下列 channels 的 XML 输出。

我想把 xml 输出变成这样:

<?xml version="1.0" encoding="UTF-8" ?>
<tv generator-info-name="www.mysite.com/xmltv">
<channel id="">
   <display-name>Information from database</display-name>
   <programme channel="Information from database" start="" stop="">
       <title lang="en"></title>
       <sub-title lang="en">
       </sub-title>
       <desc lang="en"></desc>
       <category lang="en"></category>
   </programme>
</channel>

这里是php代码:

<?php

function db_connect()
{
  define('DB_HOST', 'localhost');
  define('DB_USER', 'myusername');
  define('DB_PASSWORD', 'mypasword');
  define('DB_DATABASE', 'mydbname');

  $errmsg_arr = array();
  $errflag = false;
  $link = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);

  if(!$link) 
  {
    die('Failed to connect to server: ' . mysql_error());
  }

  $db = mysql_select_db(DB_DATABASE);
  if(!$db) 
  {
    die("Unable to select database");
  }
}
db_connect();


function clean($var)
  {
    return mysql_real_escape_string(strip_tags($var));
  } 
  $channels = clean($_GET['channels']);
  $id = clean($_GET['id']);

  if($errflag) 
  {
    $_SESSION['ERRMSG_ARR'] = $errmsg_arr;
    echo implode('<br />',$errmsg_arr);
  }
  else 
  {
    $insert = array();

    if(isset($_GET['channels'])) 
    {
      $insert[] = 'channels = \'' . clean($_GET['channels']) .'\'';
    }
    if(isset($_GET['id'])) 
    {
      $insert[] = 'id = \'' . clean($_GET['id']) . '\'';
    }


    if($channels && $id) 
    {
      $qrytable1="SELECT id, channels, links FROM tvguide WHERE channels='$channels' && id='$id'";
      $result1=mysql_query($qrytable1) or die('Error:<br />' . $qry . '<br />' . mysql_error());

      while ($row = mysql_fetch_array($result1))
      {
        ...
      }
      mysql_close();
    }
    else if(!$channels && ! $id)
    {
      $qrytable1="SELECT id, channels, links, streams FROM tvguide";
      $result1=mysql_query($qrytable1) or die('Error:<br />' . $qry . '<br />' . mysql_error());
      echo '<?xml version=""1.0"" encoding="UTF-8" ?>';
      echo '<tv generator-info-name="www.mysite.com/xmltv">';
      echo '<channel id="">';
      echo '<display-name></display-name>';
      echo '<programme channel="" start="" stop="">';
      echo '<title lang="en"></title>';
      echo '<sub-title lang="en"></sub-title>';
      echo '<desc lang="en"></desc>';
      echo '<category lang="en"></category>';
      echo '</programme>';
      echo '</channel>';


      while ($row = mysql_fetch_array($result1)) 
      {
        echo "<p id='channels'>".$row["id"]. " " . $row["channels"]. "</p>";
      }
    }
  }
?>

如果您能告诉我该怎么做,我将不胜感激。请注意;我是 PHP 的一个完整的菜鸟,任何提供的代码都会有很大的帮助。

编辑:我正在生成一个 XML 文件以保存在我的网络主机中,但我无法读取 XML 文件,因为我收到错误 error on line 3 at column 1: Extra content at the end of the document

这是 XML 输出:

<?xml version="1.0" encoding="UTF-8"?>
<tv generator-info-name="www.mysite.com/xmltv"/>
<channel><display-name>Information from database</display-name><programme/><desc/></channel>

【问题讨论】:

  • 当你说你想要“一个 XML 输出”时,你的意思是你想要生成一个 XML 文件并将它保存在服务器上的某个地方吗?
  • @larsAnders 是的,我愿意。如果您能告诉我如何将其保存在我的虚拟主机中,我将不胜感激。
  • 我在这里回答了同样的问题:stackoverflow.com/questions/22338707/…
  • @lachore 我已经回答了你的问题,你能回答一下吗?

标签: php mysql xml


【解决方案1】:

我建议使用 XMLWriter。 http://www.php.net/manual/en/ref.xmlwriter.php.

我看到你使用 mysql... 相反,我建议使用 mysqli 连接到数据库,而不是不推荐使用的 mysql。这是改进的扩展。

你可以这样做:

$xml = new XMLWriter();
$xml->openMemory();
$xml->startDTD('xml');
$xml->endDTD();
    $xml->startElement('tv');
        $xml->startAttribute('generator-info-name');
             $xml->text('www.mysite.com/xmltv'); 
        $xml->endAttribute();
        $xml->startElement('channel');
             $xml->startAttribute('id');
                 $xml->text('');
             $xml->endAttribute();
        $xml->endElement();
    $xml->endElement();
$xml->endElement();

header("Content-type: text/xml; charset=utf-8");
echo $xml->outputMemory();

祝你好运:)

【讨论】:

  • 根据您的其他 cmets,我想说您可以使用函数 file_put_contents 将输出写入文件。
【解决方案2】:

这里有一些示例代码使用 PHP 的内置类来构建 XML 树。这不是您所要求的 100%,但它演示了如何创建结构、添加子项、添加属性等。使用这个 sn-p,您可以从这里到达那里。我使用缩进来帮助我保持树结构笔直...

// create a dom document with encoding utf8
$domtree = new DOMDocument('1.0', 'UTF-8');

// create a root element of the xml tree
$tv = $domtree->createElement('tv');

    //create attributes for element
    $generator_info_name = $domtree->createAttribute('generator-info-name');
    $generator_info_name->value = 'www.mysite.com/xmltv';
    //append attribute
    $tv->appendChild($generator_info_name);
    // append element to the doc
    $tv = $domtree->appendChild($tv);

    //add a channel as a child of the root
    $channel = $domtree->createElement('channel');
    $channel_id = $domtree->createAttribute('id');
    $channel_id->value = '""';
    $channel = $tv->appendChild($channel);

        //append children to channel
        $channel->appendChild($domtree->createElement('display-name','Information from database'));
        $channel->appendChild($domtree->createElement("programme"));
        $channel->appendChild($domtree->createElement('desc'));

    //finally, save the file
    echo $domtree->saveXML();
    $domtree->save('myChannel.xml');

【讨论】:

  • @larsAndres:谢谢你,这就是我真正想要的。我遇到了一些问题,根输出是正确的,但我无法读取 myChannel.xml,因为我收到错误 error on line 3 at column 1: Extra content at the end of the document &lt;/tv&gt; 缺少一些东西。以及如何使用标签&lt;channel id=information from database&gt; 从数据库中输出 xml 中的每个 mysql 数据?请在我的第一篇文章中查看我的更新帖子。
  • 代替这一行:$channel = $domtree->appendChild($channel);,添加这一行:$channel = $tv->appendChild($channel);这会将频道元素附加到 TV 元素,使 XML 有效。我还在上面编辑了我的答案。
  • 谢谢,我可以看到问题已解决。我在 XML 中有 &lt;channel&gt; 标记。我想将该标签更改为&lt;channel id=""&gt;,您能告诉我如何将其从&lt;channel&gt; 更改为&lt;channel id=""&gt;,以及如何从mysql 为&lt;channel id=""&gt; 中的每一行输出以创建每个&lt;channel id=""&gt;标签包括display-nameprogrammedesc标签?
  • 如果你仔细看看我给你的代码,答案就在那里。有一个你正在尝试做的事情的例子 - 添加一个属性。事实上,这个属性已经为你准备好了。它是创建的,只是没有附加。查看 $generator_info_name 的属性是如何生成的。效仿。
  • 是的,但是您发布的代码不会从 mysql 数据库输出数据,我想将标签从 &lt;channel&gt; 更改为 &lt;channel id'""&gt; 以及其他标签,包括 display-nameprogrammedesc
猜你喜欢
  • 1970-01-01
  • 2018-02-15
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 2016-03-22
  • 2016-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多