Как экспортировать данные mysql в xml с помощью php
Ниже приведен код для экспорта данных из таблицы mysql в виде XML файла. Я попробовал несколько кодов, но не получил результат. Пожалуйста, проверьте и помогите мне.
В настоящее время получить результат
8sarathsarathernakulam423432washington9rahulrahulernakulam21212121newyork10aaaa3london11bbbb1newyork12cccc2washington13dddd3london
код
<?php
require_once "classes/dbconnection-class.php";
if(isset($_POST['export'])){
header('Content-type: text/xml');
$xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
$root_element = "addressbook"; //fruits
$xml .= "<$root_element>";
$query = "SELECT AB.id, AB.name, AB.firstname, AB.street, AB.zipcode, AB.city_id, CI.city FROM address_book AS AB INNER JOIN city AS CI ON AB.city_id = CI.id";
$result = $mysqli->query($query);
if (!$result) {
die('Invalid query: ' . $mysqli->error());
}
while($result_array = $result->fetch_assoc()){
$xml .= "<address>";
foreach($result_array as $key => $value)
{
//$key holds the table column name
$xml .= "<$key>";
//embed the SQL data in a CDATA element to avoid XML entity issues
$xml .= "<![CDATA[$value]]>";
//and close the element
$xml .= "</$key>";
}
$xml.="</address>";
}
$xml .= "</$root_element>";
header ("Content-Type:text/xml");
//header('Content-Disposition: attachment; filename="downloaded.xml"');
echo $xml;
}
?>
Браузер показывает
<?xml version="1.0" encoding="UTF-8"?><addressbook><address><id><![CDATA[8]]></id><name><![CDATA[sarath]]></name><firstname><![CDATA[sarath]]></firstname><street><![CDATA[ernakulam]]></street><zipcode><![CDATA[42343]]></zipcode><city_id><![CDATA[2]]></city_id><city><![CDATA[washington]]></city></address><address><id><![CDATA[9]]></id><name><![CDATA[rahul]]></name><firstname><![CDATA[rahul]]></firstname><street><![CDATA[ernakulam]]></street><zipcode><![CDATA[2121212]]></zipcode><city_id><![CDATA[1]]></city_id><city><![CDATA[newyork]]></city></address><address><id><![CDATA[10]]></id><name><![CDATA[a]]></name><firstname><![CDATA[a]]></firstname><street><![CDATA[a]]></street><zipcode><![CDATA[a]]></zipcode><city_id><![CDATA[3]]></city_id><city><![CDATA[london]]></city></address><address><id><![CDATA[11]]></id><name><![CDATA[b]]></name><firstname><![CDATA[b]]></firstname><street><![CDATA[b]]></street><zipcode><![CDATA[b]]></zipcode><city_id><![CDATA[1]]></city_id><city><![CDATA[newyork]]></city></address><address><id><![CDATA[12]]></id><name><![CDATA[c]]></name><firstname><![CDATA[c]]></firstname><street><![CDATA[c]]></street><zipcode><![CDATA[c]]></zipcode><city_id><![CDATA[2]]></city_id><city><![CDATA[washington]]></city></address><address><id><![CDATA[13]]></id><name><![CDATA[d]]></name><firstname><![CDATA[d]]></firstname><street><![CDATA[d]]></street><zipcode><![CDATA[d]]></zipcode><city_id><![CDATA[3]]></city_id><city><![CDATA[london]]></city></address></addressbook>
Ответы
Ответ 1
Когда мы имеем дело с XML и HTML, лучший способ действовать - когда-либо через парсер.
В этой конкретной ситуации работа с парсером гарантирует действительный XML и чистый, короткий код.
После определения mySQL-запроса мы запускаем новый DOMDocument
с версией и кодировкой, затем мы устанавливаем его ->formatOutput
в True для печати XML в отступом:
$query = "SELECT AB.id, AB.name, AB.firstname, AB.street, AB.zipcode, AB.city_id, CI.city FROM address_book AS AB INNER JOIN city AS CI ON AB.city_id = CI.id";
$dom = new DOMDocument( '1.0', 'utf-8' );
$dom ->formatOutput = True;
Затем мы создаем корень node и добавляем его к DOMDocument
:
$root = $dom->createElement( 'addressbook' );
$dom ->appendChild( $root );
В этот момент после выполнения mySQL-запроса мы выполняем цикл while
через каждую результирующую строку; для каждой строки мы создаем пустой node <address>
, затем мы выполняем цикл foreach
через каждое поле строки. Для каждого поля мы создаем пустой дочерний узел с тегом в качестве ключа поля, а затем добавляем к childnode значение поля как CDATA и тот же дочерний номер в <address>
node; в конце каждого цикла while
каждый <address>
node добавляется к root node:
$result = $mysqli->query( $query );
while( $row = $result->fetch_assoc() )
{
$node = $dom->createElement( 'address' );
foreach( $row as $key => $val )
{
$child = $dom->createElement( $key );
$child ->appendChild( $dom->createCDATASection( $val) );
$node ->appendChild( $child );
}
$root->appendChild( $node );
}
Теперь ваш XML готов.
Если вы хотите сохранить его в файл,, вы можете сделать это:
$dom->save( '/Your/File/Path.xml' );
В противном случае, если вы предпочитаете отправлять его как XML, вы должны использовать этот код:
header( 'Content-type: text/xml' );
echo $dom->saveXML();
exit;
Если вы хотите вместо выводить его на страницу HTML, вы можете написать этот код:
echo '<pre>';
echo htmlentities( $dom->saveXML() );
echo '</pre>';
Ответ 2
Перейдите в экспорт базы данных phpmyadmin и выберите xml в формате файла.
Ответ 3
Заменить
$xml .= "<![CDATA[$value]]>";
с
$xml .= $value;
Ответ 4
ЕСЛИ вы хотите, чтобы он отформатировал его "красиво" в браузере, добавьте:
echo "<pre>";
перед:
echo $xml;
Обратите внимание, что WILL BREAK XML файл, но он будет хорошо выглядеть в браузере... если это то, что вы после...
Ответ 5
Я бы предложил использовать библиотеки типа SimpleXMLElement и т.д. для создания XML-документов.
$xml = new SimpleXMLElement("<?xml version=\"1.0\" encoding=\"UTF-8\" ?><{$root_element}></{$root_element}>");
while($result_array = $result->fetch_assoc()){
foreach($result_array as $key => $value)
{
$address = $xml->addChild("address");
//embed the SQL data in a CDATA element to avoid XML entity issues
$addressFields = $address->addChild('"' . $key . '"', "<![CDATA[$value]]>");
//No need to close the element
}
}
Header('Content-type: text/xml');
print($xml->asXML());