簡體   English   中英

XMLReader(在Php中)和錯誤處理

[英]XMLReader (in Php) and Error Handling

快速版:

什么是標准(創新?任何?)方式捕獲和處理XMLReader由於格式錯誤的文件引發的錯誤 - 特別是未轉義的字符。 預感Tidy(等等)並不是一個超級吸引人的選擇,任何人都知道如何簡單地跳過違規節點並向右移動?

描述性版本:

我們都知道如果它沒有正確形成它不是XML,但說實話 - 它發生了。 客戶端經常會輸入需要讀入mysql的大量(50-100MB +)xml文件。 XMLReader是顯而易見的選擇,我們編寫了一個適合我們需求的包裝器。

偶爾會發生錯誤並且read()無法殺死導入 - drat! 它幾乎總是一個沒有逃脫的角色(前“&”),它將所有東西都絆倒。 在大多數情況下,我們只是讓客戶端調用數據提供者並要求他們修復有缺陷的文件。 不幸的是,數據提供者並不總是樂於和/或及時。 如果我們能夠簡單地捕獲錯誤並向右移動到下一個節點,那將是驚人的。

我花了很長時間試圖閱讀/破解這個,並找不到值得細讀的東西。 我錯過了一些明顯的東西嗎

這個問題似乎很有希望,但它不會產生任何結果。 傳遞1似乎應該要求讀者恢復,但我們只是沒有看到任何嘗試/不同的錯誤消息等。這是相關的代碼概述了方法:

$xml->open($file, null, LIBXML_NOERROR | LIBXML_NOWARNING | 1);

我總是可以用Tidy進行預處理,但必須有更好的方法。

我已經考慮了一些更“創造性”的方法,例如在當前節點的邏輯完成后用try / catch嗅探下一個Read(),但這看起來最笨拙 看起來似乎有可能使用自定義/包裝函數模擬Read(),這有助於在節點中移動並包含錯誤處理,但我有一種感覺,我過分簡化了事情。

總而言之:當read()失敗時,我如何捕獲錯誤並繼續前進? 我們有機會看到會發生什么錯誤(至少XMLReader會拋出的消息)?

$xml = new XMLReader();
$xml->open($file);

while ($xml->read()) {  

}

關於問題的“查看錯誤”部分:

http://php.net/manual/en/function.libxml-use-internal-errors.php當此設置為默認false值時,將在任何無效的XML上觸發PHP警告。 換句話說,你應該看到它:p你只是沒有注意,或者有一個設置或自定義錯誤處理程序,它隱藏了你的PHP警告。

如果使用true調用上述函數,則不會生成警告,而是會在此函數返回的內部數組中累積錯誤:

http://www.php.net/manual/en/function.libxml-get-errors.php

關於“移動”部分,我擔心cweiske是對的,它無法完成。 您可以使用某些工具預先篩選XML以查找錯誤(甚至使用XMLReader解析它們)並嘗試更正找到的錯誤,即刪除/替換無效字符,但是您需要重新啟動對已更正數據的解析。

它是一個XML閱讀器,它可以讀取XML。 無效的XML不是XML,也不能用XML閱讀器讀取 - 就這么簡單。

在導入之前在文件上運行xmllint以查看它是否有效,或者執行正確的操作並告訴數據提供程序生成有效的xml。

我遇到了同樣的問題。 使用流過濾器 ,您可以在將XML提供給XMLReader之前修復XML。

HTML到XML過濾器執行此操作。 用它作為

$dsn = "php://filter/read=htmltoxml.entities/resource=" . $url;
$xml = XMLReader::open($dsn);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM