我正在使用PEAR XML_Feed_Parser。 我有一些bad xml我给它并得到错误。
DOMDocument::loadXML(): Input is not proper UTF-8, indicate encoding !
Bytes: 0xE8 0xCF 0xD3 0xD4 in Entity, line: 7
它实际上是错误编码的html - KOI8-R。
可以得到错误但我无法处理它!
当我用。创建新的XML_Feed_Parser实例时 $ feed = new XML_Feed_Parser($ xml);
它调用__construct(),看起来像那个
$this->model = new DOMDocument;
if (! $this->model->loadXML($feed)) {
if (extension_loaded('tidy') && $tidy) {
/* tidy stuff */
}
} else {
throw new Exception('Invalid input: this is not valid XML');
}
我们可以看到如果loadXML()失败则抛出异常。
我想从loadXML()中捕获错误以跳过错误的XML并通知用户。所以我用try-catch包装我的代码
try
{
$feed = new XML_Feed_Parser($xml);
/* ... */
}
catch(Exception $e)
{
echo 'Feed invalid: '.$e->getMessage();
return False;
}
但即使在那之后我也收到了这个错误
DOMDocument::loadXML(): Input is not proper UTF-8, indicate encoding !
Bytes: 0xE8 0xCF 0xD3 0xD4 in Entity, line: 7
我读过有关loadXML()并发现
如果将空字符串作为源传递,则会生成警告。此警告不是由libxml生成的,无法使用libxml的错误处理函数进行处理。
但不知怎的,而不是警告我得到错误,停止我的申请。我写了我的错误处理程序,我发现这确实是警告($ errno是2)。
所以我看到了2个解决方案:
将警告还原为警告 - 请勿 把它们视为错误。 (谷歌 在这里没有帮助我)。之后 handle从loadXML返回的False。
不知何故发现了这个错误。
任何帮助?
答案 0 :(得分:3)
libxml_use_internal_errors(true)
解决了我的问题。它使libxml使用正常错误,所以我可以从loadXML()中捕获False。
答案 1 :(得分:0)
试试这个:
$this->model = new DOMDocument;
$converted = mb_convert_encoding($feed, 'UTF-8', 'KOI8-R');
if (! $this->model->loadXML($converted)) {
if (extension_loaded('tidy') && $tidy) {
/* tidy stuff */
}
} else {
throw new Exception('Invalid input: this is not valid XML');
}
或者您可以这样做而无需像这样修改XML_Feed_Parser:
$xml = mb_convert_encoding($loaded_xml, 'UTF-8', 'KOI8-R');
$feed = new XML_Feed_Parser($xml);