2009-12-24 129 views
2

我有一个php脚本,它将xml数据写入文件,另一个将此文件的内容作为响应发送给客户端。 但是在客户端,即时得到以下错误: XML解析错误:没有很好地形成 当我查看网页的源,所述XML我看到的是如下:XML格式不正确错误

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<books><date>December 24th, 2009</date><total>2</total><book><name>Book 1</name><url>http://www.mydomain.com/posters/68370/img.jpg</url></book><book><name>Book 2</name><url>http://www.anotherdomain.com/posters/76198/img1.jpg</url></book></books> 

file1中.PHP我有下面的代码的XML写入文件:

$file= fopen("book_results.xml", "w"); 
$xml_writer = new XMLWriter(); 
$xml_writer->openMemory(); 
$xml_writer->startDocument('1.0', 'UTF-8', 'yes'); 
$xml_writer->startElement('books'); 
$xml_writer->writeElement('date',get_current_date()); // Like December 23rd, 2009 
$xml_writer->writeElement('total',$totalResults); 
foreach($bookList as $key => $value) { /* $bookList contains key value pairs */ 
    $xml_writer->startElement('book'); 
    $xml_writer->writeElement('name',$key); 
    $xml_writer->writeElement('url',$value); 
    $xml_writer->endElement(); //book 
} 
$xml_writer->endElement(); //books 
$xml_data = $xml_writer->outputMemory(); 
fwrite($file,$xml_data); 
fclose($file); 

而且在index.php中,我有以下代码来发送文件的内容作为响应

<?php 
    //Send the xml file contents as response 
    header('Content-type: text/xml'); 
    readfile('book_results.xml'); 
?> 

什么可能导致错误?

请帮忙。 谢谢。

+0

你用什么来查看xml客户端? IE浏览器? FF?什么版本? – James 2009-12-24 20:08:31

+0

得到同样的错误在这两个Firefox 3.5及IE 8. – joew 2009-12-24 20:18:08

回答

0

您是否尝试过使用作为替代属性?:

<books date="December 24th" total="2"> 

另外,XML可以说是相当敏感的2宽松的日期和总的标签。确保使用适当的CDATA标签

+1

无论日期/总是属性或元素无关与是否良好地形成-XML的格式。这是一个设计决定。 – 2009-12-24 20:14:46

+0

-1甚至暗示在这种情况下CDATA可能是有用的。对于CDATA来说,恰当的使用案例非常少,即使您对于垃圾处理特别不小心,也可以用一只手的手指数出它们。 – 2009-12-27 17:40:56

1

有一些免费的网站和工具用于检查XML中的有效性。

根据XML Validator,当我将上面的XML粘贴到textarea中时,它表示“找不到错误”。

但是,Validome表示“找不到元素'book'的声明。”

也许杰夫的建议将datetotal更改为属性可能会有所帮助。这可能很容易尝试。

+0

变更书,总的子元素属性,但仍然得到同样的错误:(。 – joew 2009-12-24 20:18:48

+0

正如我上面提到的,日期/总是否属性或元素无关与是否合式-XML的格式。这是一个设计决策。 – 2009-12-24 20:21:04

3

以上对我来说很好(包括你通过形成一个专门的组件XML的事实),要么:

  1. 你使用来验证这是错误的什么
  2. 你”再看看你认为你不同的东西

我肯定会尝试另一种工具/浏览器/无论如何来验证这一点。另外,您可能希望将XML文件保存为发送给浏览器,并使用XMLStarlet(命令行XML工具包)对其进行检查。

我想知道如果这是一个我们无法轻易看到的问题 - 字符编码问题或字节顺序标记问题(与编码有关)。您发送的网页的字符编码是否与XML(UTF-8)的编码不同?

+0

感谢您的答复布赖恩。如何检查网页IM的字符编码是否发送与从XML的编码/不同(UTF-8)? – joew 2009-12-24 20:28:53

+0

也许您在使用Firebug的Firefox的HTTP标头或的LiveHTTPHeaders? – 2009-12-24 20:46:24

+1

+1提的字节顺序标记。如果这两个PHP和XML文件中包含这些,就混淆了XML解析器,因为BOM应该只出现在文件的开始 – 2009-12-24 21:57:52

0

它在WMHelp XMLPad 3.0.1.0中验证正常,并在FireFox 3.0.8和IE7中正常打开,没有错误。

我可以从XML的复制和粘贴中看到的唯一一件事情是,XML声明后面跟着一个CR/LF组合(0x0D0x0A)。这是平台特定的(Windows),可能是客户端的问题;你没有提到客户是什么,但是,我不能确定这是否是问题所在。

0

确保你正在编写UTF-8或7位ASCII编码的文件(测试用文本编辑器或“文件”命令,如果你有的话),你的检查支持它。请记住,UTF-8可以在前三个字节(EF BB BF)中包含一个签名(有时称为字节顺序标记),如果它存在,有时会混淆某些工具,而如果不是这样,则很少。

0

XML版本= '1.0' 编码= 'UTF-8' 独立= '是'

使用单引号。