我这里有一个小脚本,它使用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,因为这是我最熟悉的功能。
任何想法都将受到高度赞赏。
提前致谢!
答案 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']);
}
这样,我们正在做的是:
答案 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;
}
然后你可以将子节点分配给加载到数组中的这些创建节点,并在主循环中检查哪个节点要附加它。