2015-03-13 86 views
2

我有一個來自外部源的XML文檔,我需要每天一次又一次地使用XML::Simpleperl模塊進行解析。我的腳本是從crontab運行的,如果XML文檔是健康的,它就可以正常工作。但我得到的錯誤信息和死,如果該文件是無效的,這樣的事情:Perl:如何解析無效的XML文檔?

junk after document element at line 740774, column 0, byte 36355798 at /usr/local/lib/perl/5.18.2/XML/Parser.pm line 187. 

我發現XML文檔中的這條線,它看起來像這樣:

<item> 
    <element1>value1</element1> 
    <element2>value2</element2> 
    value3</element3> 
    <element4>value4</element4> 
</item> 

我可以分析這個錯誤的文件沒有死?也許從解析器中刪除這個項目併發出警告(而不是死!)或以某種方式忽略錯誤?

+2

不,你不能分析畸形的XML。你需要說服誰來創建數據來正確地完成它,或者在你處理它之前自己修復它。錯誤總是相似嗎? – Borodin 2015-03-13 13:32:43

+0

不,它們是變量......我認爲它來自源系統的開發人員。如果他們犯錯誤,我會得到格式不正確的XML。 – netdjw 2015-03-13 13:43:51

+0

不要認爲它是XML。把它看作是發起者發明的專有語法。爲此語法編寫語法,如有必要,對其進行逆向工程,然後爲此語法編寫解析器。昂貴,但完全可行。如果你想要一個更便宜的選擇,說服供應商採用XML:使用標準可以節省每個人的錢。 – 2015-03-13 14:38:01

回答

3

你不知道。格式不正確的XML是一個致命錯誤,您絕對不應該嘗試修復它。

根據定義,這是一個致命錯誤,因爲如果沒有這樣做,最終解析器不得不處理各種邊界情況。所以你應該拒絕XML,並告訴上游的人員修復它。

參見:Dealing with malformed XML

,尤其是:http://www.xml.com/axml/notes/Draconian.html

我們希望XML授權程序員編寫能夠通過Web傳輸的代碼並執行了大量的桌面。但是,如果此代碼必須包含對各種粗糙的最終用戶實踐的錯誤處理,那麼它必然會大到像Netscape Navigator或Microsoft Internet Explorer那樣尺寸達到幾十兆字節,因此擊敗目的。

在這種情況下 - 你也不應使用XML::Simple它有它的文檔:

使用本模塊中新代碼是不鼓勵。其他模塊可提供更直接和一致的接口。

基本上 - XML::Simple在於它不是一個簡單的XML解析器。它的簡單的XML。還有更好的選擇。

我會建議考慮類似XML::Twig而不是。 (還有其他選擇 - 這是我最喜歡的)。

但都不會處理格式不正確的XML - 任何解析器的作用是根據定義中斷。

+2

@netdjw:發起者在發送給你之​​前驗證XML非常容易。他們甚至可以通過['xmlvalidation.com'](http://www.xmlvalidation.com/) – Borodin 2015-03-13 14:10:21