如何在Haskell中重新实现这个pythonxmlparsing函数?

2024-06-26 06:04:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近编写了下面的Python函数,它将使用googlepicasa联系人.xml归档并输出一个带有ID和名称的字典。在

def read_contacts_file(fn):
    import xml.etree.ElementTree
    x = xml.etree.ElementTree.ElementTree(file=fn)
    q = [(u.attrib["id"], u.attrib["name"]) for u in x.iter("contact")]
    return dict(q)

这个函数的作用是返回一个dictionary(hashtable,map),ID是键,Name是值。在

文件本身的格式为:

^{pr2}$

在Haskell中实现这个最简单的方法是什么?在


我只是想让你知道,在大家的帮助下,我想出了以下对我来说有意义的东西。谢谢。在

parseContactsData = M.fromList . runLA (xread >>> f) 
    where f = 
        getChildren 
        >>> hasName "contact" 
        >>> getAttrValue "id" &&& getAttrValue "name"

Tags: 函数name名称idcontact联系人xmlfile
3条回答

下面是一个对tagsoup执行相同操作的最小示例:

import Text.HTML.TagSoup

assocLookup k dict = [v | (k', v) <- dict, k == k']
readContactsFile fn = fmap parse (readFile fn)

parse contents = do
    TagOpen "contact" attrs <- parseTags contents
    id <- assocLookup "id" attrs
    name <- assocLookup "name" attrs
    return (id, name)

另一种选择是使用HXT库。这里有一些有用的信息可以帮助你开始:http://www.haskell.org/haskellwiki/HXT/Conversion_of_Haskell_data_from/to_XML

对您特别有用的可能是3.5 A simple application

下面是一个使用HXT执行此操作的示例

import Text.XML.HXT.Core
import Data.Map

idAssocs = hasName "contact" >>> getAttrValue "id" &&& getAttrValue "name"
dict = fromList `fmap` runX (readDocument [] "contacts.xml" >>> deep idAssocs)

相关问题 更多 >