关于生成 XML 报错的解决方法

2012/02/05

相信很多用过WordPress的朋友会碰到这种错误,现象是这样的。

打开FeedBurner上的Feed发现页面空空的,如果是IE,按提示查看详细信息,它会告诉你< ?xml ………. ?>起始位置不在第一行,也就是这一行前面有空行;如果是Firefox,错误提示差不多;如果是Opera,会有这样的提示,但是它会提示你按照HTML格式解析,然后你就能看到xml文件的代码了。其实,如果在IE或者Firefox中打开错误,你用右键单击页面并“查看源代码”的话,是能看到与Opera中用HTML格式解析时看到的一样的东西。这说明WordPress的Feed输出是没有问题的,出问题的在于某个文件的格式。

This page contains the following errors:
error on line 2 at column 6: XML declaration allowed only at the start of the document
Below is a rendering of the page up to the first error.

XML 解析错误:XML 或文本声明不在实体的开头
位置:http://blog.zhnytech.com/feed/
行:2,列:1:<?xml version="1.0" encoding="UTF-8"?>

不幸的是却很难找到是哪个文件出了问题,到是哪个文件出了问题在W3官网上有针对这一问题的描述和解决方法指导,我在这里引用一下。

Message

Blank line before XML declaration (WordPress)

Explanation

If an XML declaration (“) appears in your feed, it must be the first thing in the feed, before any whitespace.

Unfortunately, with WordPress it seems all too easy for a plugin, a theme, or for your configuration file to contain a blank line. Further compounding this problem, some — but not all — feed readers compensate for this common error, allowing the error to go undetected for quite a while.

Solution

  • PHP also uses a similar notation:?`. Note that the final?*php*??>`?should be omitted from all PHP code files—modules, includes, etc. The closing delimiter is optional in PHP (but not in XML), and removing it helps prevent unwanted white space at the end of files which can cause problems with your feeds.
  • Check your?wp-rss2.php?and?wp-atom.php?files for blank lines outside of??and??>`?bracketed sections.
  • Check your?wp-config.php?file for blank lines outside of??and??>`?bracketed sections.
  • Check your theme’s?functions.php?file for blank lines outside of??and??>`?bracketed sections.
  • One by one, disable plugins and revalidate until you isolate the one causing the problem.

大体意思是:

如果一个XML声明(”) 出现在你的Feed文件中,它必须是该Feed文件中的第一个出现的,应该在任何空白(译者注,空格、空行)之前。不幸的是,WordPress中的插件、主题、配置文件等却很容易带有空行,这使得这个问题变得复杂起来。

解决方法

PHP文件也会使用一个类似的记号:`。最好将最后的?*php*??>`?从所有的PHP代码文件,如modules, includes中扔掉。这个结束符号在PHP中可要可不要(但是在XML中却必须要有),去掉这个标记可以避免在文件结尾出现不希望出现的空白,对防止出现类似问题有帮助。

  • 检查你的?wp-rss2.php?和?wp-atom.php?文件,看看在??和??>`?标记之外是不是有空行。
  • 检查你的?wp-config.php?文件看看在??和??>`?标记之外是否有空行。
  • 检查你的主题中?functions.php?文件,看看在??和??>`?标记之外是否有空行。
  • 一个一个的禁用插件并检查Feed是否出错,直到确定导致问题的那个插件。

此时问题基本能够解决,如果不能解决请看看其他文件是否有空行。改完后可能需要清空浏览器缓存并刷新一会才能看到结果。

我认为对于我们普通用户,检查的重点应该是插件,而不是文件代码,除非你在这之前修改过文件代码。因为如果本来没有问题而突然出现了这样的状况,那说明那些相关的代码不应该是有问题的,因为不管是WordPress文件、插件,还是主题,这都是经过检验的,一般不会出问题。所以,对于普通用户而不是程序员来说,应该先检查你最近启用的插件,排除之后再针对其它的几条进行检查。

上一篇:自编用PHP来获取GOOGLE PR值代码