为什么每次通过此循环都没有得到一个封闭的XML节点?

时间:2019-03-24 23:02:44

标签: php xml dom

我正在从MySQL数据库中提取一些记录。没问题,我有48,000条记录可以使用。我正在获取所有数据。我一直看着这个,直到我的眼睛一直在游泳。当我尝试将行转换为XML时,结构化应该是:

<listings>
    <listing (some attributes)></listing>
    <listing (some attributes)></listing>
    <listing (some attributes)></listing>
</listings>

相反,XML的结构如下:

<listings>
    <listing (some attributes> 
        <listing (some attributes> 
           <listing (some attributes>
           </listing>
        </listing>
     </listing>
</listings>

这是创建xml的声明和循环:

$dom = new DOMDocument('1.0','utf-8');
$node = $dom->createElement("listings");
$parnode = $dom->appendChild($node);

while ($row = @mysql_fetch_assoc($result)){
      // Add to XML document node
      $node = $dom->createElement("listing");
      $newnode = $parnode->appendChild($node);
      $newnode->setAttribute("id",$row['id']);
      $newnode->setAttribute("title",$row['title']);
      $newnode->setAttribute("latitude",$row['latitude']);
      $newnode->setAttribute("longitude",$row['longitude']);
}

1 个答案:

答案 0 :(得分:1)

构建完该节点后,您需要添加该节点:

<?php

$arr = [
  [
    'id' => 1,
    'title' => 'title 1',
    'latitude' => '1.1',
    'longitude' => '2.1'
  ],
  [
    'id' => 2,
    'title' => 'title 2',
    'latitude' => '1.2',
    'longitude' => '2.2'
  ],
];

$dom = new DOMDocument('1.0','utf-8');
$parnode = $dom->createElement("listings");
while ($row = array_shift($arr)){
      // Add to XML document node
      $newnode = $dom->createElement("listing");
      $newnode->setAttribute("id",$row['id']);
      $newnode->setAttribute("title",$row['title']);
      $newnode->setAttribute("latitude",$row['latitude']);
      $newnode->setAttribute("longitude",$row['longitude']);
      $parnode->appendChild($newnode);
}
$dom->appendChild($parnode);

echo $dom->saveHTML();

输出:

<listings>
    <listing id="1" title="title 1" latitude="1.1" longitude="2.1"></listing> 
    <listing id="2" title="title 2" latitude="1.2" longitude="2.2"></listing> 
</listings>

Demo

仅供参考,you shouldn't use mysql_* functions in new code。从v5.5(2013年6月)开始不推荐使用,从v7.0(2015年12月)开始将其删除。看到red box吗?相反,请了解prepared statements,并使用PDOMySQLi-this article将帮助您确定最适合您的一个。

此外,请勿使用错误抑制运算符(@),因为它会隐藏错误消息,这些消息可能有助于调试代码。您还应该始终编写代码,以免产生任何PHP错误,包括声明。