2

我正在尝试学习一些 Haskell,并且我想解析一些具有以下结构的 XML 文件:

<properties>
  <property name="a">
    <value>1</value>
  </property>
  <property name="b">
    <value>2</value>
  </property>
</properties>

按照wiki中的示例,我可以通过以下方式搜索所有属性

runX (readDocument [ withValidate no] "my.xml" 
           >>> deep (isElem >>> hasName "properties")

但我怎样才能只提取的价值元素property name="b"

4

2 回答 2

3

老实说,我发现这HXT是一个使用起来相当复杂的库。到目前为止,我的理解是您使用箭头链将文档转换为另一个文档。

如果您想学习箭头,您可能会发现我的解决方案是作弊的,但对我来说它完成了工作:我只是使用XPath( cabal install hxt-xpath) 并生成一个输出文档。

import Text.XML.HXT.Core
import Text.XML.HXT.XPath.Arrows 

main :: IO ()
main = do
      runX $ readDocument [] "my.xml"
            >>>
            root [] [ selem "values" [getXPathTrees "/properties/property[@name=\"b\"]/value"]]
            >>>
            writeDocument [withIndent yes] "out.xml"
      return ()

屈服

<?xml version="1.0" encoding="UTF-8"?>
<values>
  <value>2</value>
</values>
于 2014-09-01T20:09:28.743 回答
1

TagSoup 确实为我做了这件事。根据我找到的教程

module Main where
import Text.HTML.TagSoup

searchXML :: IO ()
searchXML = do
      rsp <- readFile "test.xml"
      let tags  = parseTags rsp
      let links = extr "value" [] $
                  extr "property" [("name","b")] tags
      let value = fromTagText $ links !! 0
      putStr value
      where 
          extr a b c = drop 1 $ takeWhile (~/= TagClose a) $
                       dropWhile (~/= TagOpen a b) c

main = searchXML

仅打印 value 2。但我很确定代码可以简化很多。

于 2014-09-02T08:37:22.233 回答