如何使用PHP将MySQL数据导出为XML?

10

以下代码用于将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>

我有这样的印象,你所说的结果实际上只是在浏览器中可视化的内容。请注意,浏览器无法以任何有意义的方式可视化您创建的XML。建议查看浏览器显示的文档源代码或将输出转储到文件中并查看该文件。 - arkascha
@arkascha, 谢谢,我已经更新了浏览器之后得到了我问题的结果。我检查了一下但是没有找到问题所在。我不知道为什么结果不能正确显示。 - Sarath TS
好的,看起来好多了!现在如果您能告诉我们您得到的结果有什么问题,我们实际上就能帮助您解决问题了... - arkascha
我不明白哪里出了问题。 - martin
浏览器中显示的结果似乎是正确的...你如何得到第一个结果?否则,浏览器的结果是错误的吗? - Matteo Tassinari
1
您的浏览器永远不会像 <?xml version="1.0" encoding="UTF-8"?><addressbook><address>... 这样显示 XML,它只会显示标签内的值。但是,如果您查看页面源代码,您将看到完整生成的 XML。 - Armen
5个回答

7

当我们处理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循环遍历每个字段。对于每个字段,我们创建一个带有字段键的空子节点,然后将字段值作为CDATA附加到子节点并将同一个子节点附加到<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页面上输出它,可以编写以下代码:

如果您想将其输出到 HTML 页面中,可以编写此代码:

echo '<pre>';
echo htmlentities( $dom->saveXML() );
echo '</pre>';


2
在某个地方,bobince 骑着小马笑了起来 - Machavity
@fusion3k 非常感谢你 - Sarath TS

3

请前往phpmyadmin数据库导出页面,选择XML文件格式。


0

替换

$xml .= "<![CDATA[$value]]>";

使用

$xml .= $value;

你需要详细说明一下,以避免被踩。原帖作者说他正在使用 CDATA 来避免破坏 XML 兼容性。 - Machavity

0

如果你想在浏览器中以“漂亮”的方式格式化它,请添加:

echo "<pre>";

在此之前:

echo $xml;

请注意,这将破坏XML文件,但在浏览器中它会看起来很好...如果这是你想要的...

0
我建议使用像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());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接