使用HXT unpickler忽略XML属性

时间:2012-08-22 19:59:07

标签: xml haskell hxt

我正在编写一个小应用程序,旨在从多个站点中抓取XML,然后以我想要的方式处理数据。我以前用不同的语言制作了这样的应用程序,我正在为Haskell实践写这个。

无论如何,到了这一点。在百万和一个不同的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

我知道我没有处理所有属性。我不想要所有的属性。有没有办法忽略这些?我想我可以处理所有属性,将它们放在一个新的数据类型中,然后从中提取属性以获取我真正想要的数据。我想避免这个小小的黑客,因此我就在这里,要求正确的方式。

我是否使用了错误的工具?解开第三方数据是不安全的(就像在Python中一样)?

我环顾网络寻找解决方案,但Text.XML.HXT.Arrow.XmlState.SystemConfig似乎没有我需要禁用此行为。

2 个答案:

答案 0 :(得分:5)

前几天我遇到了这个确切的问题,并得出以下结论:

  

我是否使用了错误的工具?

是。 HXT的pickle功能旨在轻松地序列化和反序列化数据,但没有太大的灵活性。从链接页面:

  

它们旨在读取机器生成的XML,理想情况下由同一个pickler生成。

至于:

  

对第三方数据进行unpickling不安全(就像在Python中一样)?

不是HXT,不是。 python中的pickling是不安全的,因为它(松散地)等同于在任意内容上调用eval()。 HXT只是一个XML解析器,不需要调用任意代码。

就个人而言,我已经开始使用xml包(Text.XML.Light)手动处理XML,而不是试图让HXT的pickler做我想做的事情。它并不简洁,但它让我忽略了我不关心的数据。你可能也可以使用HXT的非泡菜部分,如果你喜欢箭头(我还在我的头上缠绕它们);)。

答案 1 :(得分:3)

您可以忽略 xpFilterAttr 的XML属性和 xpFilterCont 的XML标记。

结帐此代码: 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标签被保留,如果没有,那么它被过滤掉。 (< +>)将一些条件与OR逻辑组合。