4

我正在编写一个小型应用程序,旨在从多个站点抓取 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

我知道我没有处理所有属性。我不想要所有的属性。有没有办法忽略这些?我想我可以处理所有属性,将它们放入一个新的数据类型中,然后从中提取属性以获得我真正想要的数据。不过,我想避免这种小技巧,因此我在这里,要求 The Proper Way™。

我是否使用了错误的工具来完成这项工作?unpickling 3rd 方数据是否不安全(就像在 Python 中一样)?

我在网上寻找解决方案,但Text.XML.HXT.Arrow.XmlState.SystemConfig似乎没有禁用此行为所需的东西。

4

2 回答 2

5

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

我是否使用了错误的工具来完成这项工作?

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

它们旨在读取机器生成的 XML,最好是由同一个pickler 生成。

至于:

unpickling 3rd 方数据是否不安全(就像在 Python 中一样)?

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

就个人而言,我已经转而使用 xml 包 (Text.XML.Light) 手动处理 XML,而不是尝试让 HXT 的pickler 来做我想做的事。它没有那么简洁,但它让我忽略了我不关心的数据。不过,如果你喜欢箭头的话,你大概也可以使用 HXT 的非泡菜部分(我仍然把头绕在它们周围;))。

于 2012-08-23T08:20:13.897 回答
3

您可以忽略带有 xpFilterAttr 的 XML 属性和带有xpFilterContXML 标记。

签出此代码: 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 逻辑相结合。

于 2014-08-05T19:12:14.450 回答