Как экспортировать данные 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());