如何解决用PHP将数据输出为XML
| 我这里有一个小脚本,该脚本使用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,因为这是我最熟悉的功能。
任何想法将不胜感激。
提前致谢!
解决方法
您应该制作一个节点数组,并检查该节点是否存在,而不是每次都创建它。为此:
[...]
$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并设置其属性。
至此,我们确定已经创建了该节点,因此只需将新元素添加到该节点即可。
, 您的问题是,对于每个迭代,您都会创建新的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;
}
然后,您可以将子级分配给这些已创建的加载到数组中的节点,并在主循环中仅检查要追加哪个节点。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。