2017-04-22 107 views
0

我正试图从MySQL表导出数据到XML文件。文件末尾的额外内容mysql php xml

我使用Adobe Dreamweaver的CC 2015年创建的index.php文件包含下面的代码:

<?php 
header('Content-type: text/xml'); 

$xmlout = "<?xml version=\"1.0\" ?>"; 
$xmlout .= "<list>"; 

$db = new PDO('mysql:host=hostname;dbname=dbname','dbusername','password'); 
$stmt = $db->prepare("select * from tablename"); 
$stmt->execute(); 
while($row = $stmt->fetch()){ 
$xmlout .= "\t<persons>\n"; 
$xmlout .= "\t\t<id>".$row['ID']."</id>\n"; 
$xmlout .= "\t\t<name>".$row['name']."</name >\n"; 
$xmlout .= "\t\t<phone>".$row['phone']."</phone >\n"; 
$xmlout .= "\t\t<address>".$row['address']."</address >\n"; 
$xmlout .= "\t\t<status>".$row['status']."</status>\n"; 
$xmlout .= "\t</persons>\n"; 
} 

$xmlout .= "</list>"; 
echo $xmlout; 
?> 

当我运行页面,我觉得这个错误:

error on line 10 at column 8: Extra content at the end of the document

结果中铬检查>来源> index.php

<?xml version="1.0" ?> 
<list> 
    <persons> 
     <id>1</id> 
     <name>John</name> 
     <phone>123456</phone> 
     <address>123 street</address> 
     <status>Ready</status> 
    </persons> 
</list> 

但有一个。之后,当我试图用http://www.xmlvalidation.com/来验证我的XML输出我发现,

</list>&#65279; 

我应该做些什么来解决这个问题?

回答

0

考虑使用专用的W3C兼容的XML库,如PHP的DOMDocument类来构建XML内容而不是连接的文本字符串。使用createElement,appendChild,setAttribute以及formatOutputpreserverwhiteSpace属性的方法,可以避免需要连接特殊字符,如换行符,制表符和尖括号。

需要注意的是,XML不是像csv/txt这样的原始文本文件,而是一种标准化的结构化文档,它具有编码和标记规则来描述数据。

header('Content-type: text/xml'); 

// INITIALIZE DOM OBJECT 
$dom = new DOMDocument('1.0', 'UTF-8'); 
$dom->formatOutput = true;    
$dom->preserveWhiteSpace = false; 

// CREATE ROOT AND APPEND TO DOCUMENT 
$xmlRoot = $dom->createElement("list"); 
$xmlRoot = $dom->appendChild($xmlRoot); 

// QUERY DATABASE 
$db = new PDO('mysql:host=hostname;dbname=dbname','dbusername','password'); 
$stmt = $db->prepare("select * from tablename"); 
$stmt->execute(); 

// FETCH ROWS ITERATIVELY 
while($row = $stmt->fetch()){ 
    // APPEND PERSON AS CHILD OF ROOT 
    $personNode = $xmlRoot->appendChild($dom->createElement('person')); 

    // APPEND CHILDREN TO PERSON   
    $personNode->appendChild($dom->createElement('id', $row['id'])); 
    $personNode->appendChild($dom->createElement('name', $row['name'])); 
    $personNode->appendChild($dom->createElement('phone', $row['phone'])); 
    $personNode->appendChild($dom->createElement('address', $row['address'])); 
    $personNode->appendChild($dom->createElement('status', $row['status'])); 
} 
$stmt = null; 
$db = null; 

// OUTPUT TO SCREEN 
echo $dom->saveXML(); 
+0

感谢@Parfait为您的质量解释,但如果你可以在另一种情况下帮助我,我怎样才能从其他表中加载数据到人节点? 你可以看到这个Url作为参考去理解我的意思。 http://www.informit.com/articles/article.aspx?p=27800 –

+0

哈哈......很高兴收到你的来信!很高兴它有帮助!对于其他表,如果它们在这里关联并扩展获取循环,可以考虑将它们加入到SQL中。 – Parfait

+0

@ Parfait请在下面检查我的帖子 –

0

您正在生成XML,而您并未从数据库中转义数据。这意味着任何XML中具有特殊含义的字符都会打破输出。

如果您要生成XML/HTML输出,请谨慎使用htmlspecialchars()的转义值。

或者甚至更好地使用像XML或XMLWriter这样的XML API来生成XML并让API处理序列化。

PHP文件不需要关闭文件末尾的?>。您可以忽略它并避免输出结尾的空格。