Как экспортировать данные 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>
5 ответов
когда мы имеем дело с 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;
затем мы создаем корневой узел и добавляем его к DOMDocument
:
$root = $dom->createElement( 'addressbook' );
$dom ->appendChild( $root );
на данный момент, после выполнения запроса mySQL, мы выполняем while
цикл через каждую результирующую строку; для каждой строки мы создаем пустой узел <address>
, то мы выполняем foreach
цикл через поле каждой строки. Для каждого поля мы создаем пустой childnode с тегом в качестве ключа поля, затем мы добавляем в childnode значение поля как CDATA и тот же childnode в <address>
узел; в конце каждого while
петли, каждая <address>
узел добавляется к корню узел:
$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>';
- подробнее о DOMDocument
Если вы хотите, чтобы он отформатировал его "красиво" в браузере, добавьте:
echo "<pre>";
перед:
echo $xml;
обратите внимание, что это сломает XML-файл, но он будет хорошо выглядеть в браузере.... если это то, что вам нужно...
Я бы предложил использовать библиотеки, такие как SimpleXMLElement etc. создание 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());