вывод данных с 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, так как это функция, с которой я лучше всего знаком.

Любые идеи будут высоко оценены.

Заранее спасибо!


person Spy_eye    schedule 12.06.2011    source источник


Ответы (2)


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

[...]
$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 и устанавливая его атрибут.
  • На данный момент мы точно знаем, что узел создан, поэтому мы просто добавляем новый элемент к узлу.
person Lumbendil    schedule 12.06.2011
comment
Хорошо, спасибо за ввод, но я попробовал ваш код, и он дает мне непредвиденную ошибку: Ошибка синтаксического анализа: синтаксическая ошибка, неожиданный '{' в D:\wamp\www\fibreglass\exportintoxml2.php в строке 41 Что такое { начала оператора if. Я не могу понять, почему это. - person Spy_eye; 13.06.2011
comment
это потому, что в if отсутствуют скобки. Я исправлю это сейчас. - person Lumbendil; 13.06.2011
comment
бесконечно благодарен! это очень помогает :) теперь мне приходится иметь дело с javascript... :) - person Spy_eye; 13.06.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;
}

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

person Erveron    schedule 12.06.2011
comment
Это подразумевает добавление дополнительного запроса, который не нужен, поскольку данные уже получены с текущим запросом. - person Lumbendil; 13.06.2011