我最近编写了以下Python函数,该函数将使用Google Picasa contacts.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)
这个函数的作用是返回一个字典(哈希表,映射),其中ID是键,Name是值。
文件本身的格式为:
<contacts>
<contact id="f5fdaaee2e80fa01" name="Person A" display="A"/>
<contact id="8d5256298fd43877" name="Person B" display="B"/>
</contacts>
我在Haskell中实现这个的最简单方法是什么?
只是想让你知道,在大家的帮助下,我已经设法提出以下对我有意义的事情。感谢。
parseContactsData = M.fromList . runLA (xread >>> f)
where f =
getChildren
>>> hasName "contact"
>>> getAttrValue "id" &&& getAttrValue "name"
答案 0 :(得分:7)
以下是使用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)
答案 1 :(得分:6)
以下是使用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)
答案 2 :(得分:1)
另一种方法是使用HXT库。以下是一些有用的信息,可以帮助您入门:http://www.haskell.org/haskellwiki/HXT/Conversion_of_Haskell_data_from/to_XML
特别有用的可能是3.5 A simple application