2012-11-02 52 views
3

對於這個問題,我將從我正在使用的xml文件中粘貼一個示例節,然後討論我正在嘗試使用它。Text.XML.Cursor - 丟失的類型

我有節看起來像這樣的XML文件:

<mb model="460" rev="dba"> 
     <dmiblock block="Base Board Information"> 
       <dmiattr name="Manufacturer" value="MSI"/> 
       <dmiattr name="Product Name" value="H61M-P25 (MS-7680)"/> 
     </dmiblock> 
     <dmiblock block="Memory Device"> 
       <dmiattr name="Bank Locator" value="A1_BANK0"/> 
       <dmiattr name="Size" value="4096 MB"/> 
     </dmiblock> 
     <dmiblock block="Memory Device"> 
       <dmiattr name="Bank Locator" value="A1_BANK1"/> 
       <dmiattr name="Size" value="No Module Installed"/> 
     </dmiblock> 
     <dmiblock block="Memory Device"> 
       <dmiattr name="Bank Locator" value="A1_BANK2"/> 
       <dmiattr name="Size" value="No Module Installed"/> 
     </dmiblock> 
     <dmiblock block="Memory Device"> 
       <dmiattr name="Bank Locator" value="A1_BANK3"/> 
       <dmiattr name="Size" value="No Module Installed"/> 
     </dmiblock> 

     <cpublock number="0"> 
       <cpuattr name="model name" value="Intel(R) Pentium(R) CPU G850 @ 2.90GHz"/> 
     </cpublock> 
     <cpublock number="1"> 
       <cpuattr name="model name" value="Intel(R) Pentium(R) CPU G850 @ 2.90GHz"/> 
     </cpublock> 
     <pciblock block="NIC"> 
       <pciattr string="Intel Corporation 82574L Gigabit Network Connection" number="2" /> 
     </pciblock> 
     <blockblock block="model"> 
       <blockattr value="8GB SATA SSD T 3" number="1" /> 
       <blockattr value="WDC WD5003ABYX-0" number="1" /> 
     </blockblock> 
</mb> 

我想基於屬性modelmbnode價值和從第二個元素在value屬性來查找節第一個孩子的mbnode。所以,在上面的節中,我會嘗試匹配model="460"value="H61M-P25 (MS-7680)"。經過匹配,我想把rev="dba"放入列表中,並繼續搜索其他mbnodes中具有相同屬性的其他章節。

我還沒有走得很遠,我不斷得到類型絆倒。我正在使用this來工作。

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       $ 
     T.concat      $ 
     cursor      $// 
     element "mb"     >=> 
     attributeIs "model" "460" >=> 
     element "dmiattr"   >=> 
     attributeIs "value" "H61M-P25 (MS-7680)" 
     &// content 

我知道最終的功能content是錯的,但我不知道這將是正確的。我試圖從匹配的節點捕獲所有rev屬性。

所以,當我玩上述時,我最終會得到一個空列表,垃圾字符或類型錯誤。任何幫助,將不勝感激。

回答

4
  1. 我認爲您正在尋找attribute函數。
  2. 使用>=> element "dmiattr"你說「當前元素的名稱是dmiattr」。我想你可能意味着&/ element "dmiattr"。但既然你希望父的@rev屬性,你可能需要使用check函數。