【发布时间】:2016-03-08 16:09:30
【问题描述】:
我想我在 PHP 5.5.33 和 5.6.19 的 XMLReader::readOuterXML 中发现了一个错误... PHP 5.2.17 很好,没有使用 7 进行测试。我的 PHP 是 VC11 x86 线程安全的,使用 Apache 2.4。 18 VC11 Win32.
在读取以 UTF-8 正确编码的 XML 文件(带或不带 BOM)时,readOuterXML 有时会生成警告 "Input is not proper UTF-8, indicate encoding !",即使在违规行之前读取了多个 UTF-8 编码字符。
删除了一些标签或字符串的同一个文件将毫无问题地通过。
这是我用来读取 XML 文件的函数的简化版:
function TestXML($file) {
$XR = new XMLReader;
$XR->open($file, null, LIBXML_NOBLANKS);
//Looking for specific node
while (($lastRead = $XR->read()) && ($XR->name !== 'records')) {
;
}
if (!$lastRead) {
echo $file.' : Invalid file or no records';
$XR->close();
return;
}
//Looking for specific node
while (($lastRead = $XR->read()) && ($XR->name !== 'record')) {
;
}
while ($lastRead) {
$xml = $XR->readOuterXML();
if ($xml === '') {
$err = '';
if ($e = libxml_get_last_error()) {
$err = $e->message.' (line: '.$e->line.')';
}
$XR->close();
echo $file.' : Problem with file'.($err ? ' — '.$err : '').'.';
return;
}
//Looking for specific node
while (($lastRead = $XR->next()) && ($XR->name !== 'record')) {
;
}
}
$XR->close();
echo $file.' : Good!';
return;
}
这是我能产生的最小的 XML(没有 BOM):
<?xml version="1.0" encoding="utf-8"?>
<records>
<record><aaa><bbbb><ccc><![CDATA[XXX Xxxxxxxxxxxx]]></ccc><ddd><![CDATA[XXX Xx]]></ddd></bbbb><eee><![CDATA[Xxxxx xxxxxxx: xxxx://xxx.xxx.xx.xx/xxxx?xxxxXx=0xx000x0-000x-0xx0-x000-x0000xx0xx00
Xxxxxxxxxxxx xx Xxxxxxxxxxxx Xxxxxxxxx xx Xxxxxxxxx Xxxxxxxxxxxx Xxxxxxxxxxx Xxxxxxxxxxxx (XXX Xxxxxxxxxxxx), xxxxxxxxx xxxxxxx xx Xxx Xxxxxxxxxx Xxxxxxxxxx Xxx.]]></eee></aaa><fff><bbbb><ggg><![CDATA[Xxxxxxxxx Xxxxxxxxxxxxxxx Xxxxxxxxxx xx Xxxxxxxxxxxx]]></ggg><ccc><![CDATA[XXX Xxxxxxxxxxxx]]></ccc></bbbb><hhh><![CDATA[Xx xxxxx, xx xxxxxxxxxxx XXX Xxxxxxxxxxxx x xxxxxcé x’xxxxxxxx xxx x’Xxxxxxléx léxxxxxxxxx xx xx xxxxxxxx xx xx Xxxxxxxxxx Xxxxxxxxxx Xxx (xxx xxx xx xxxxxxxxxx xxxxxxxxx). Xxxxx xxx xréxxxx xxx xxxxxx xxx déxxxxxxxx XXX Xxxxxxxxxxxx xx xxxx xx’xxxxxxxxxxxx xxxxxxxxxxxxxxx xxxxréxxxxxxtéx xx xxxxxxx xxx XX, xxx XXX xx xxx XXX xx xx xxxxxxxx xx xxxxx x’xxxxxxxx xx xxxxx xx xxxxxxxxx xxxxxxxxxxxxx xxréé (XXX). (Xxxxxxxxéx XXX - Xxx 0000)]]></hhh></fff></record>
</records>
由于添加几个空格可以解决问题(例如,如果上面是美化的,它不会引起问题),我已经上传了我用于测试的文件:
Bad file(不带 BOM)
Bad file(带 BOM 和从 <ggg> 标记的内容中删除的几个“x”)
Good file(与坏的相同,少<ccc> 标签)。
您还可以从 Bad 文件中删除几个“单词”,它会通过。
那么,这真的是 PHP 中的一个错误,还是我只是遗漏了什么?
【问题讨论】:
-
它确实被确认为 libxml 2.9.3 (bug #760183) 中的一个错误 (bug #71805),它从 5.5.32 和 5.6.18 开始在 PHP 中使用