2012-04-16 25 views
2

我们有一个脚本,用于解析来自用户生成的源的XML源,这些源中不时地包含具有特殊字符的格式错误的条目。使用PHP的XMLReader,DOM和SimpleXML强制UTF8格式

虽然我通常只是在线上运行utf8_encode(),但我不确定如何做到这一点,因为DOM正在逐步读取文件,并且在展开命令发生时引发错误。

由于代码上的simple_xml扼流圈,后续行也关闭。

这是代码。

$z = new XMLReader; 
$z->open($filename); $doc = new DOMDocument('1.0','UTF-8');   
while ($z->read() && $z->name !== 'product'); 
while ($z->nodeType == XMLReader::ELEMENT AND $z->name === 'product'){ 
$producti = simplexml_import_dom($doc->importNode($z->expand(), true)); 
print_r($producti); 
} 

错误:

消息:XMLReader的::扩展():foo.xml:29081:分析器错误:输入是 不正确UTF-8,编码指示!字节数:0×05 0×20 0x2D 0x35

严重性:警告

消息:XMLReader的::扩展():一个错误发生 同时扩大

文件名:控制器/ feeds.php

行号:106

消息:传递给DOM文档参数1 :: importNode()必须的DOMNode的 例如,布尔给出

文件名: 控制器/feeds.php

行号:106

+0

做这些文件* *宣布,他们在UTF-8编码会当他们其实并没有,或者你只是不关心他们是在和什么编码*假设他们用UTF-8编码?你有没有打破你的解析器的文档样本? – deceze 2012-04-17 07:47:20

+0

大多数声明UTF-8,但不是全部。不幸的是,我处理文件的可变性给了发送数据源的类型。 – 2012-04-18 16:37:58

回答

1

使用HTML整洁库先清洁您的字符串。

另外我最好使用DOMDocument而不是XMLReader。

类似的东西:

 $tidy = new Tidy; 

     $config = array(
       'drop-font-tags' => true, 
       'drop-proprietary-attributes' => true, 
       'hide-comments' => true, 
       'indent' => true, 
       'logical-emphasis' => true, 
       'numeric-entities' => true, 
       'output-xhtml' => true, 
       'wrap' => 0 
     ); 

     $tidy->parseString($html, $config, 'utf8'); 

     $tidy->cleanRepair(); 

     $xml = $tidy->value; // Get clear string 

     $dom = new DOMDocument; 

     $dom->loadXML($xml); 

     ... 
+0

我会看看...如何在循环内调用它,以便每个xml块都被过滤?该文件太大,无法预先清理(内存使用量巨大)。 – 2012-04-17 07:12:30

+0

没有只是应用整个'$文件名'整洁。查看修改后的答案 – 2012-04-17 07:41:03

+0

谢谢。我需要一段时间才能从XMLReader重建到DOM以进行全面测试,但似乎目前工作正常。 – 2012-04-18 18:53:09