2012-04-16 58 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