发送使用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');
谢谢
它可能是阵列$friendList
有密钥和/或值在他们的标签(一个或多个)。如果是这种情况,我们的XML字符串$_xml
将不是有效的XML。
的代码,你贴罚款没有任何$friendList
数据作品中的片段,所以问题在于你的数据。
我打算猜测,您在<webpage></webpage>
标记中输出的网址可能包含&
等字符。 XML要求& ' " > <
字符被转义。幸运的是,htmlspecialchars()确实如此。
尝试使用这样的:
$_xml.="<webpage>".htmlspecialchars($value,ENT_QUOTES)."</webpage>";
这不是一个坏主意来逃避其他部分的数据也是如此。
您也可以尝试'CDATA'块:'$ _xml = “
您有从未打开关闭的“朋友”的标签。改变相关剪断到:
$_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);
我使用OO风格的界面来写这个数据出来,而不是原始同意。 XML,但是如果你检查他的代码的顶部,“friends”节点实际上是根节点,并且是在XML声明之后打开的第一个东西。 – Dereleased 2009-12-23 20:45:31
感谢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;
我要写入文件的原因是,我不想动态生成每一个页面请求的XML。 – Jimg 2009-12-23 21:38:01
@Jimg这和你现在正在做的完全一样。唯一的区别是您正在写入相同的文件,而不是直接在页面上显示它。你会使用result.xml来达到其他目的吗? – 2009-12-23 21:58:36
尝试发布实际的XML。这可能只是一个错误。另外,为什么你将它保存到一个文件?为什么不只是echo $ _xml? – ctford 2009-12-23 20:36:49