我在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
答案 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
相同,因此检查失败。