使用PHP将数据输出到XML中

时间:2011-06-12 22:44:20

标签: php xml domdocument

我这里有一个小脚本,它使用DOMDocument从我的mysql数据库中获取数据并将其放在结构化的XML中,后来用于读取。

调整我的php代码以创建正确的XML结构时遇到一些麻烦。

现在我的代码看起来像这样:

代码:

<markers>
<DEVS DEVICE="DEV10">
<marker USER="PRIVET_!" DATA1="0578" DATA2="0A57" TIME="18:16:40" />
</DEVS>
<DEVS DEVICE="DEV10">
<marker USER="PRIVET_!" DATA1="0578" DATA2="0A55" TIME="18:16:05" />
</DEVS>
<DEVS DEVICE="DEV5">
<marker USER="PRIVET_!" DATA1="0578" DATA2="0A55" TIME="18:16:05" />
</DEVS>
<DEVS DEVICE="DEV5">
<marker USER="PRIVET_!" DATA1="0578" DATA2="0A55" TIME="18:16:05" />
</DEVS>
</markers>

我希望我的代码看起来像这样:

代码:

<markers>
<DEVS DEVICE="DEV10">
<marker USER="PRIVET_!" DATA1="0578" DATA2="0A57" TIME="18:16:40" />
<marker USER="PRIVET_!" DATA1="0578" DATA2="0A55" TIME="18:16:05" />
</DEVS>
<DEVS DEVICE="DEV5">
<marker USER="PRIVET_!" DATA1="0578" DATA2="0A55" TIME="18:16:05" />
<marker USER="PRIVET_!" DATA1="0578" DATA2="0A55" TIME="18:16:05" />
</DEVS>
</markers>

这是我目前的PHP代码:

PHP代码:

<?php   

require("config.php");  

// Start XML file, create parent node 

$dom = new DOMDocument("1.0"); 
$node = $dom->createElement("markers"); 
$parnode = $dom->appendChild($node);  

// Opens a connection to a MySQL server 

$connection=mysql_connect ($server, $db_user, $db_pass); 
if (!$connection) {  die('Not connected : ' . mysql_error());}  

// Set the active MySQL database 

$db_selected = mysql_select_db($database, $connection); 
if (!$db_selected) { 
  die ('Can\'t use db : ' . mysql_error()); 
}  

// Select all the rows in the markers table 

$query = "SELECT * FROM input WHERE (DEVS = 'DEV5' or DEVS = 'DEV10')  ORDER BY TIME DESC"; 
$result = mysql_query($query); 
if (!$result) {   
  die('Invalid query: ' . mysql_error()); 
}  

header("Content-type: text/xml");  

// Iterate through the rows, adding XML nodes for each 

while ($row = @mysql_fetch_assoc($result)){   
  // ADD TO XML DOCUMENT NODE   
  $node1 = $dom->createElement("DEVS"); 
  $parnode->appendChild($node1); 
  $marker = $dom->createElement("marker"); 
  $node1->appendChild($marker); 

  $marker->setAttribute("USER", $row['USER']); 
  $marker->setAttribute("DATA1", $row['DATA1']);   
  $marker->setAttribute("DATA2", $row['DATA2']);   
  $marker->setAttribute("TIME", $row['TIME']);  
  $node1->setAttribute("DEVICE", $row['DEVS']); 

} 

echo $dom->saveXML(); 

?>

我需要代码有一个唯一标记(DEVICE),稍后将用它作为指向应从此XML文件读取的内容的指针。 我正在使用DOMDocument,因为这是我最熟悉的功能。

任何想法都将受到高度赞赏。

提前致谢!

2 个答案:

答案 0 :(得分:0)

您应该创建一个节点数组,并检查节点是否存在而不是每次都创建它。为此:

[...]
$nodes = array();

while ($row = @mysql_fetch_assoc($result)){

    // ADD TO XML DOCUMENT NODE
    $node_key = $row['DEVS'];
    if( !array_key_exists( $node_key, $nodes ) )
    {
        $nodes[$node_key] = $dom->createElement("DEVS"); 
        $parnode->appendChild($nodes[$node_key]);
        $nodes[$node_key]->setAttribute("DEVICE", $row['DEVS']);
    }
    $marker = $dom->createElement("marker"); 
    $nodes[$node_key]->appendChild($marker); 

    $marker->setAttribute("USER", $row['USER']); 
    $marker->setAttribute("DATA1", $row['DATA1']);   
    $marker->setAttribute("DATA2", $row['DATA2']);   
    $marker->setAttribute("TIME", $row['TIME']);
}

这样,我们正在做的是:

  • 获取节点密钥。
  • 如果没有创建该密钥的节点,我们创建它,将其添加到DOM并设置它的属性。
  • 此时,我们确定已创建节点,因此我们只需将新元素附加到节点即可。

答案 1 :(得分:0)

您的问题是,每次迭代都会创建新的DEVS元素。

其中一种方法是使用另一个查询来创建DEVS组。部分代码将以某种方式解读:

$query = mysql_query("SELECT devs FROM input WHERE (devs = 'DEV5' or devs = 'DEV10') GROUP BY devs");
$result = mysql_query($query); 

$devsNodes = array();
while ($row = mysql_fetch_array($result)){    
    $node = $dom->createElement("DEVS");
    $node->setAttribute("DEVICE", $row['DEVS']); 
    $devsNodes[] = $node;
}

然后你可以将子节点分配给加载到数组中的这些创建节点,并在主循环中检查哪个节点要附加它。