вывод данных с PHP в XML - PullRequest
       10

вывод данных с PHP в XML

0 голосов
/ 13 июня 2011

У меня есть небольшой скрипт, который использует 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 голосов
/ 13 июня 2011

Ваша проблема в том, что для каждой итерации вы создаете новый элемент 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;
}

Затем вы можете назначить потомков этим созданным узлам, загруженным в массив, и в основном цикле просто проверить, какой узел добавить его.

0 голосов
/ 13 июня 2011

Вы должны создать массив узлов и проверять, существует ли узел, а не создавать его каждый раз.Для этого:

[...]
$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 и устанавливаем его атрибут.
  • На данный момент мы точно знаем, что узел создан, поэтому мы просто добавляем новый элемент в узел.
...