通过SQL从PHP生成XML

时间:2011-03-21 11:08:15

标签: php mysql

运行此代码时出错。我在数据库中没有特殊字符时运行正常。如果它有特殊字符然后我得到错误请解决我,我非常感谢。

当数据库中的任何特殊字符如“'&?”时出现以下错误我没有为什么会出现这些错误..而且我没有使用DOM或XMLWrite只是简单地通过文件创建xml,并且clerify 1件事CDDATA也不适用于我的代码我检查它。请告诉我一些如何使错误更少的xml ..

以下是代码:

    $file= fopen("../xml/{$productID}.xml" , "w"); 


    $_xml ="<?xml version=\"1.0\" encoding=\"UTF-8\" ?>";
    $_XML = "<!DOCTYPE Server SYSTEM \"opt/pdos/etc/pdoslrd.dtd\">";

    $_xml .="<productsnode>";


     while ($row = mysql_fetch_array($productQuery, MYSQL_ASSOC)) { 

        $_xml .=" <product>";
        $_xml .="   <productID>" . $row['productID'] . "</productID>";
        $_xml .="   <productName>" . htmlspecialchars($row['productName']) . "</productName>";          
        $_xml .="   <productDescription>" . htmlspecialchars($row['productDescription']) . "</productDescription>"; 
        $_xml .="   <productPicture>" . htmlspecialchars($row['productPic']) . "</productPicture>";
        $_xml .=" <category>";
        $_xml .="   <categoryID>" . $row['categoryID'] . "</categoryID>";
        $_xml .="   <categoryName>" . htmlspecialchars($row['categoryName']) . "</categoryName>";   
        $_xml .="   <categoryDescription>" . htmlspecialchars($row['categoryDiscription']) . "</categoryDescription>";  
        $_xml .="   <categoryPicture>" . htmlspecialchars($row['categoryPic']) . "</categoryPicture>";              
        $_xml .=" <subCategory>";
        $_xml .="   <subCategoryID>" . $row['subCategoryID'] . "</subCategoryID>";
        $_xml .="   <subCategoryName>" . htmlspecialchars($row['subCategoryName']) . "</subCategoryName>";  
        $_xml .="   <subCategoryDetail>" . htmlspecialchars($row['subCategoryDescription']) . "</subCategoryDetail>";               
        $_xml .=" </subCategory>";
        $_xml .=" </category>";
        $_xml .=" </product>";

    }
    $_xml .="</productsnode>";
    fwrite($file, $_xml);
    fclose($file);

4 个答案:

答案 0 :(得分:2)

将您的XML包装在CDATA中

<![CDATA[your content here]]>

(这也将处理未被htmlspecialchars()取代的特殊字符)

答案 1 :(得分:1)

特殊字符在xml中是非法的,因此您需要在CDATA标记之间包装所有内容

例如:

$_xml .="   <subCategoryName><![CDATA[" . htmlspecialchars($row['subCategoryName']) . "]]></subCategoryName>"; 

阅读更多内容 - &gt; http://www.w3schools.com/xml/xml_cdata.asp

你的代码应该是这样的:

$_xml .=" <product>";
        $_xml .="   <productID><![CDATA[" . $row['productID'] . "]]></productID>";
        $_xml .="   <productName><![CDATA[" . htmlspecialchars($row['productName']) . "]]></productName>";          
        $_xml .="   <productDescription><![CDATA[" . htmlspecialchars($row['productDescription']) . "]]></productDescription>"; 
        $_xml .="   <productPicture><![CDATA[" . htmlspecialchars($row['productPic']) . "]]></productPicture>";
        $_xml .=" <category>";
        $_xml .="   <categoryID><![CDATA[" . $row['categoryID'] . "]]></categoryID>";
        $_xml .="   <categoryName><![CDATA[" . htmlspecialchars($row['categoryName']) . "]]></categoryName>";   
        $_xml .="   <categoryDescription><![CDATA[" . htmlspecialchars($row['categoryDiscription']) . "]]></categoryDescription>";  
        $_xml .="   <categoryPicture><![CDATA[" . htmlspecialchars($row['categoryPic']) . "]]></categoryPicture>";              
        $_xml .=" <subCategory>";
        $_xml .="   <subCategoryID><![CDATA[" . $row['subCategoryID'] . "]]></subCategoryID>";
        $_xml .="   <subCategoryName><![CDATA[" . htmlspecialchars($row['subCategoryName']) . "]]></subCategoryName>";  
        $_xml .="   <subCategoryDetail><![CDATA[" . htmlspecialchars($row['subCategoryDescription']) . "]]></subCategoryDetail>";               
        $_xml .=" </subCategory>";
        $_xml .=" </category>";
        $_xml .=" </product>";

如果这不起作用,则表示还有其他内容,我建议您复制所获得的错误并将其放入您的答案中,并可能截取数据库中存储的内容。如果您需要帮助,请提供更多详细信息

答案 2 :(得分:0)

当你没有发布确切的错误时,非常难以分辨。但是,我会尝试做一个狂热的猜测:检查编码。您可能在数据库中使用拉丁瑞典语(AKA-ISO 8859-1),其余时间使用utf8 ......或者反之亦然。我建议使用utf8来节省时间。

检查表格编码,然后连接编码(默认情况下mysql_ *函数可以使用ISO-8859-1进行连接,如果发生这种情况你应该使用http://php.net/manual/en/function.mysql-set-charset.php),这应该会有所帮助。

另外:为什么要连接字符串以生成XML?使用像SimpleXML这样的适当XML库是一个更好的想法(请注意,还有其他库,您也可以检查XMLWriter以及其他许多库)。链接:http://mx.php.net/manual/en/book.simplexml.php和...我不能写另一个链接,因为我是这里的新手:)谷歌是每个人的朋友。

如果你去梨花,还有更多的东西。

答案 3 :(得分:0)

我并没有完全回答你的问题,但也许你应该看看mysql xml abilities。这可能取决于您的mysql版本,特别是如果您可以使用CLI方法访问您的sql。

上面提到的文章确实描述了通过sql选择获取xml的更复杂的方法虽然在5.0.67(win32)上对我有用。