2012-08-22 78 views
3

我正在寫一個小型應用程序,旨在從多個站點刮取XML,然後以我想要的方式處理數據。我之前用不同的語言編寫過這樣的應用程序,我正在爲Haskell編寫這個應用程序。用HXT unpickler忽略XML屬性

無論如何,要點。在瀏覽萬維網和一個不同的XML解析器之後,我決定和HXT一起去,因爲誰不喜歡箭頭。在頁面http://www.haskell.org/haskellwiki/HXT/Conversion_of_Haskell_data_from/to_XML之後,我得到了一些似乎讀取我的XML文件並將其放入我定義的Haskell數據類型的東西。我正在使用XmlPickler的實例從文件中讀取數據來實現此目的。我到達的東西,將工作,除了這個錯誤:

fatal error: document unpickling failed 
xpCheckEmptyAttributes: unprocessed XML attribute(s) detected 

我知道我沒有處理所有的屬性。我不想要所有的屬性。有沒有辦法忽略這些?我想我可以處理所有的屬性,把它們放在一個新的數據類型中,然後從中提取屬性來獲得我真正想要的數據。儘管我想避免這個小黑客,因此我在這裏,要求The Proper Way™。

我是否使用錯誤的工具進行工作?取消第三方數據不安全(就像在Python中)?

我環顧網絡尋找解決方案,但Text.XML.HXT.Arrow.XmlState.SystemConfig似乎沒有我需要禁用此行爲。

+2

你可以在這裏找到一篇優秀的文章,以hxt開頭: http:// adit。io/posts/2012-04-14-working_with_HTML_in_haskell.html – fp4me

+0

昨天發佈我的問題幾個小時後,我實際上一直在處理那篇文章。我認爲這很不錯! –

回答

5

我碰到這個確切的問題來了一天,到了下面的結論:

Am I using the wrong tool for the job?

是。 HXT的pickle功能專爲輕鬆串行化和非串行化數據而設計,但沒有太大的靈活性。從鏈接頁面:

They are intended to read machine generated XML, ideally generated by the same pickler.

至於:

Is unpickling 3rd party data unsafe (like it is in Python)?

不與HXT,沒有。在Python中酸洗是不安全的,因爲它(鬆散地)等同於在任意內容上調用eval()。 HXT只是一個XML解析器,沒有任何代碼正在進行調用。

就我個人而言,我已經開始使用xml包(Text.XML.Light)手動處理XML,而不是試圖讓HXT的picker去做我想做的事。這並不簡單,但它讓我忽略了我不關心的數據。儘管如此,假如你喜歡箭(我仍然把頭包裹在他們周圍),你大概也可以使用HXT的非酸醃部分。

3

你可以忽略XML與xpFilterAttr和XML與xpFilterCont標籤屬性。

結帳驗證碼: https://hackage.haskell.org/package/hxt-9.3.1.4/docs/src/Text-XML-HXT-Arrow-Pickle-Xml.html

像這樣:

xpElem "assign" $ 
xpFilterAttr (hasName "comment") $ ... 

xpFilterCont在過濾(上真實的情況)下一個所有標籤。因此,條件是真的XML標記被保留,如果不是,那麼它被過濾掉。 (< +>)正在將某些條件與「或」邏輯相結合。