2

我从这个问题继续这个问题。任务是在mb节点中搜索具有特定值的 ,然后过滤掉与元素中的model attribute不匹配的节点。过滤后,我需要从. 我已经取得了一些进展。我能够匹配并捕获属性的值。value attributedmiattrrev attributemodel attributerev

但是我很难深入到孩子身上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
4

1 回答 1

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,因此检查失败。

于 2012-11-09T11:05:09.860 回答