发送使用PHP

问题描述:

XML文件作为响应的内容我写XML使用PHP文件,然后我把文件数据作为客户端浏览器的响应。 但是,我发现了以下错误: XML解析错误:没有很好地形成 下面是我的代码。有任何解决这个问题的方法吗?发送使用PHP

$file= fopen("result.xml", "w"); 
$_xml ="<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"; 
$_xml .="<friends>"; 
$timestamp = time(); 
$_xml.="<date>".date("F jS, Y", $timestamp)."</date>"; //Like December 23rd, 2009 
$_xml .="<total>".$totalResults."</total>"; 
foreach($friendList as $key => $value) { /*$friendList contains key value pairs*/ 
    $_xml.="<friend>"; 
    $_xml.="<name>".$key."</name>"; 
    $_xml.="<webpage>".$value."</webpage>"; 
    $_xml.="</friend>"; 
} 
$_xml .="</friends>"; 
fwrite($file,$_xml); 
fclose($file); 

//Send the xml file as response 
header('Content-type: text/xml'); 
readfile('result.xml'); 

谢谢

+0

尝试发布实际的XML。这可能只是一个错误。另外,为什么你将它保存到一个文件?为什么不只是echo $ _xml? – ctford 2009-12-23 20:36:49

它可能是阵列$friendList有密钥和/或值在他们的标签(一个或多个)。如果是这种情况,我们的XML字符串$_xml将不是有效的XML。

的代码,你贴罚款没有任何$friendList数据作品中的片段,所以问题在于你的数据。

我打算猜测,您在<webpage></webpage>标记中输出的网址可能包含&等字符。 XML要求& ' " > <字符被转义。幸运的是,htmlspecialchars()确实如此。

尝试使用这样的:

$_xml.="<webpage>".htmlspecialchars($value,ENT_QUOTES)."</webpage>"; 

这不是一个坏主意来逃避其他部分的数据也是如此。

+1

您也可以尝试'CDATA'块:'$ _xml = “”;' – 2009-12-23 20:42:02

您有从未打开关闭的“朋友”的标签。改变相关剪断到:

$_xml .="<friends>"; 
foreach($friendList as $key => $value) { /*$friendList contains key value pairs*/ 
    $_xml.="<friend>"; 
    $_xml.="<name>".$key."</name>"; 
    $_xml.="<webpage>".$value."</webpage>"; 
    $_xml.="</friend>"; 
} 
$_xml .="</friends>"; 

使用somethring像XMLWriter使得它更容易和更清洁写这样的代码:

$xml_writer = new XMLWriter(); 
$xml_writer->openMemory(); 

$xml_writer->startDocument('1.0', 'UTF-8', 'yes'); 
... 
$xml_writer->startElement('friends'); 
... 
$xml_writer->endElement(); //friends 
... 
$data = $xml_writer->outputMemory(); 
echo($data); 
+0

我使用OO风格的界面来写这个数据出来,而不是原始同意。 XML,但是如果你检查他的代码的顶部,“friends”节点实际上是根节点,并且是在XML声明之后打开的第一个东西。 – Dereleased 2009-12-23 20:45:31

+0

感谢Roland的回复。我现在使用了XMLWriter,但是我仍然遇到了错误。我的新代码是http://pastebin.com/m52da93a。请帮助。 – Jimg 2009-12-23 21:21:56

的XML即时得到是这样的:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<friends><date>December 23rd, 2009</date><total>2</total><friend><name>ABC</name><url>http://www.somesite.org/abc</url></friend><friend><name>PQR</name><url>http://www.somesite.org/pqr</url></friend></friends> 

在提供文件之前,没有理由写入文件。直接输出到客户端:

$_xml .="</friends>"; 
//Send the xml file as response 
header('Content-type: text/xml'); 
echo $_xml; 
+0

我要写入文件的原因是,我不想动态生成每一个页面请求的XML。 – Jimg 2009-12-23 21:38:01

+1

@Jimg这和你现在正在做的完全一样。唯一的区别是您正在写入相同的文件,而不是直接在页面上显示它。你会使用result.xml来达到其他目的吗? – 2009-12-23 21:58:36