【问题标题】:How can export mysql data in to xml using php如何使用php将mysql数据导出到xml
【发布时间】:2016-05-28 00:37:32
【问题描述】:

以下代码用于将 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,谢谢,我已经用我的问题更新了浏览器结果。我检查了,但我没有发现问题。我不知道为什么结果不正确。
  • 好的,看起来好多了!现在,如果您还告诉我们您得到的结果到底有什么问题,我们实际上可以帮助您解决问题...
  • 我不明白什么不起作用
  • 您的浏览器永远不会向您显示像&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;addressbook&gt;&lt;address&gt;... 这样的xml,它只会显示标签内的值,但是如果您查看页面的源代码,您将看到您生成的完整xml

标签: php php-5.3 php-5.5 php-5.6


【解决方案1】:

转到您的 phpmyadmin 数据库导出并选择文件格式的 xml。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      当我们处理 XML 和 HTML 时,最好的方法是永远通过解析器。 在这种特殊情况下,使用解析器进行操作可以保证有效的 XML 和干净、简短的代码。

      定义mySQL查询后,我们用版本和编码初始化一个新的DOMDocument,然后我们将他的-&gt;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 循环;对于每一行,我们创建一个空节点&lt;address&gt;,然后我们对每一行的字段执行foreach 循环。对于每个字段,我们创建一个以标签为字段键的空子节点,然后将字段值作为 CDATA 附加到子节点,并将相同的子节点附加到 &lt;address&gt; 节点;在每个while 循环结束时,每个&lt;address&gt; 节点都附加到根节点:

      $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>';
      

      【讨论】:

      【解决方案4】:

      如果您想让它在浏览器中“很好地”格式化,请添加:

      echo "<pre>";
      

      之前:

      echo $xml;
      

      请注意,这会破坏 XML 文件,但它在浏览器中看起来不错....如果这是您所追求的...

      【讨论】:

        【解决方案5】:

        替换

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

        $xml .= $value;
        

        【讨论】:

        • 您将不得不详细说明这一点以避免被否决。 OP 说他使用CDATA 来避免破坏 XML 兼容性
        猜你喜欢
        • 1970-01-01
        • 2021-12-22
        • 1970-01-01
        • 1970-01-01
        • 2013-01-05
        • 1970-01-01
        • 2013-04-04
        • 1970-01-01
        • 2013-09-09
        相关资源
        最近更新 更多