PHP生成的XML解析失败

时间:2013-05-14 06:44:14

标签: php xml codeigniter domdocument

在我使用PHP 5.3.x的CodeIgniter 2.x项目中,我使用以下函数将Dom Document呈现为XML响应。每件事都很顺利。但由于某些格式错误的意外文本(根元素外部的非空白文本),生成的XML解析失败。

function renderDOMAsXML(DOMDocument &$dom, $format = true, $status = 200){
    $dom->formatOutput  = $format;
    $controller         = &get_instance();

    $controller->output->set_status_header($status);
    $controller->output->set_header('Content-type: application/xml; charset=utf-8');
    $controller->output->set_output($dom->saveXML());
}

为了我的好奇心,我将格式错误的意外文本(根元素外的非空白文本)解码为十六进制格式,如下所示。

\x00ef\x00bb\x00bf\x00ef\x00bb\x00bf\x00ef\x00bb\x00bf\x00ef\x00bb\x00bf\x00ef\x00bb\x00bf

\x{00ef}\x{00bb}\x{00bf}\x{00ef}\x{00bb}\x{00bf}\x{00ef}\x{00bb}\x{00bf}\x{00ef}\x{00bb}\x{00bf}\x{00ef}\x{00bb}\x{00bf}

或者像这样



我无法意识到错误是什么。什么是格式错误的意外文本(根元素外的非空白文本)?他们有任何标题信息吗?我如何跳过它们,因为我想将其呈现为浏览器的XML响应。

1 个答案:

答案 0 :(得分:1)

实际上你的代码没问题。只有 php file encoding 上的问题。永远不要在 Unicode encoding 上保存任何文件,例如 UTF-8|Unicode|Unicodebig endian 。仅将您的php文件保存为 ANSI Encoding 。如果您使用 UTF-8|Unicode|Unicodebig endian 创建一个php文件,则会自动对 php code 进行编码< strong> echo 表示格式错误的意外文字(根元素外的非空白文字)。

\x{00ef}\x{00bb}\x{00bf}\x{00ef}\x{00bb}\x{00bf}\x{00ef}\x{00bb}\x{00bf}\x{00ef}\x{00bb}\x{00bf}\x{00ef}\x{00bb}\x{00bf}

这就是为什么您最新的浏览器无法解析您的xml响应并导致xml解析错误的原因。实际上格式错误的意外文本(根元素外的非空白文本)可能是 Unicode encoding 文件格式的标题信息。

如果您使用 Unicode encoded php,这些意外的文字始终位于您的回复开头,但在您使用其他内容类型响应标头时不会中断文件。

如果您遇到此类问题,请尽快将所有文件编码转换为 ANSI Encoding