XML Child / Sibling Parsing

时间:2012-11-02 21:01:28

标签: xml haskell yesod

我在this问题中继续解决这个问题。任务是搜索mb个节点 具有特定值的model attribute,然后过滤掉那些没有的值 匹配value元素中的attribute dmiattr。过滤后,我需要从rev attribute中捕获值列表。我取得了一些进展。我可以与model attribute进行匹配,并捕获rev属性的值。

但我很难深入了解孩子dmiattr。我想我几乎都有正确的功能,也许不是正确的组合器。也许我的代码的逻辑也是不可靠的。我不确定它出了什么问题。反馈意见。

import Text.XML
import Text.XML.Cursor
import qualified Data.Text as T



getProfiles :: AdviseConf -> IO () -- AdviseResult
getProfiles  (AdviseConf model mb) = do
   doc <- Text.XML.readFile def xmlFile
   let cursor = fromDocument doc
   _ <- Prelude.writeFile "test.txt" $
        show                         $
        cursor                       $//
        check findNode               &.// -- &//
        attributeIs "model" "460"    &.//
        check findMB                 &.//
        followingSibling             &.//
        attributeIs "value" "GF615M-P33  (MS-7597)" &.//
        attribute "rev"
   return ()

findNode :: Cursor -> Bool
findNode c = case (attribute "rev" c) of
              []  -> False
              otherwise -> True

findMB :: Cursor -> Bool
findMB c = case ( attribute "value"  c) of
            [] -> False
            otherwise -> True

1 个答案:

答案 0 :(得分:1)

我没有按照代码中的所有细节(例如followingSibling的目的是什么?)。但我认为这让你非常接近你想要的东西:

{-# LANGUAGE OverloadedStrings #-}
import Text.XML
import Text.XML.Cursor

main = do
   doc <- Text.XML.readFile def "test.xml"
   let cursor = fromDocument doc
   print $
        cursor                       $//
        hasAttribute "rev"           >=>
        attributeIs "model" "460"    &.//
        check (\c -> c $// element "dmiattr"
                       >=> attributeIs "value" "GF615M-P33  (MS-7597)") >=>
        attribute "rev"

请注意check函数的参数返回一个列表。如果该列表为空,则将其视为与False相同,因此检查失败。