【问题标题】:Assigning xml generated by a while loop to a variable将while循环生成的xml分配给变量
【发布时间】:2011-03-07 16:50:56
【问题描述】:

我正在使用 while 循环创建 XML,但现在我需要在生成的 XML 之前添加 XML 标头信息和包装标记,但我很难让它工作,这是我的代码,

$result = mysql_query("SELECT * FROM users")
or die(mysql_error());

$row = mysql_fetch_array($result);

    while ($row = mysql_fetch_array($result)) {
        $pumaXML  = "<userDetails>";
        $pumaXML .= "<userID>".$row['uid']."</userID>";
        $pumaXML .= "<userName>".$row['userName']."</userName>";
        $pumaXML .= "<points>".$row['points']."</points>";
        $pumaXML .= "<imageURL>".$row['imageURL']."</imageURL>";
        $pumaXML .= "<thumbURL>".$row['thumbURL']."</thumbURL>";
        $pumaXML .= "</userDetails>";
    };

我好像找不到办法,我也试过做一个函数,但效果不太好,这是代码,

function createXML($result) {
    while ($row = mysql_fetch_array($result)) {
        $pumaXML  = "<userDetails>";
        $pumaXML .= "<userID>".$row['uid']."</userID>";
        $pumaXML .= "<userName>".$row['userName']."</userName>";
        $pumaXML .= "<points>".$row['points']."</points>";
        $pumaXML .= "<imageURL>".$row['imageURL']."</imageURL>";
        $pumaXML .= "<thumbURL>".$row['thumbURL']."</thumbURL>";
        $pumaXML .= "</userDetails>";
    };
    return $pumaXML;
};

提前谢谢!

【问题讨论】:

  • 您有什么理由通过字符串连接生成 XML 而不是使用 DOM 正确执行它?
  • 嗯,这似乎是最简单的方法,但我不知道如何使用 DOM。

标签: php mysql xml


【解决方案1】:

这里是使用DOM的方法:

function createUserDetailsXml(array $result) {

    $dom  = new DOMDocument;
    $dom->formatOutput = TRUE; // enable automatic indenting
    $dom->loadXML('<users/>'); // set root node

    foreach($result as $row) {

        // create user-details node
        $user = $dom->createElement('user-details');

        // create and append details to user-details node
        $user->appendChild(
            $dom->createElement('user-id', $row['uid']));
        $user->appendChild(
            $dom->createElement('user-name', $row['userName']));
        $user->appendChild(
            $dom->createElement('user-points', $row['points']));
        $user->appendChild(
            $dom->createElement('image-url', $row['imageURL']));
        $user->appendChild(
            $dom->createElement('thumb-url', $row['thumbURL']));

        // add user-details node to XML document, e.g. users node
        $dom->documentElement->appendChild($user);
    };
    return $dom->saveXML(); // returns the formatted XML
};

请注意,该函数希望您传入完整的结果数组,因此我可以使用以下方法对其进行测试:

$result = array(
    array(
        'uid'      => 1,
        'userName' => 'Gordon',
        'points'   => PHP_INT_MAX,
        'imageURL' => 'http://example.com/gordon.jpg',
        'thumbURL' => 'http://example.com/t_gordon.jpg'
    ),
    array(
        'uid'      => 2,
        'userName' => 'John <blink>"Frigging"</blink> Doe',
        'points'   => 0,
        'imageURL' => 'http://example.com/johndoe.jpg',
        'thumbURL' => 'http://example.com/t_johndoe.jpg'
    )
);
echo createUserDetailsXml($result);

然后函数会返回

<?xml version="1.0"?>
<users>
  <user-details>
    <user-id>1</user-id>
    <user-name>Gordon</user-name>
    <user-points>2147483647</user-points>
    <image-url>http://example.com/gordon.jpg</image-url>
    <thumb-url>http://example.com/t_gordon.jpg</thumb-url>
  </user-details>
  <user-details>
    <user-id>2</user-id>
    <user-name>John &lt;blink&gt;"Frigging"&lt;/blink&gt; Doe</user-name>
    <user-points>0</user-points>
    <image-url>http://example.com/johndoe.jpg</image-url>
    <thumb-url>http://example.com/t_johndoe.jpg</thumb-url>
  </user-details>
</users>

请注意,DOM 会自动为您转义 John Doe 名字中的特殊字符。 DOM 还将确保 XML 元素名称(或使用它们的属性)在语法上是有效的。它还添加了 XML Prolog。

【讨论】:

  • @DrColossos 谢谢。最优雅的方法是让数据库直接返回 XML,但我认为 MySql 还不能这样做。
  • 有可能在某种程度上扩展 dev.mysql.com/tech-resources/articles/xml-in-mysql5.1-6.0.html 我自己使用过,但是查询很快就会变得不可读;)当然,就 DOM 或其他任何东西而言,它不是“真正的”XML,而是一个很好的和关于该主题的有趣方法
  • 感谢您抽出宝贵时间提供帮助!我不确定我是否得到了正确的输出,我将 $row 传递给函数 $row = mysql_fetch_array($result);我假设这是不正确的,但我不确定如何让 mySQL 以这样的方式导出用户信息,以便每个用户信息都在数组内、主数组内,还是我误解了它?
  • @kielie 只需将 foreach 循环与您的 while 循环交换并从函数中删除 array 类型提示,以便您可以从问题示例中传入 $result 。跨度>
猜你喜欢
  • 2013-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多