3

对于这个问题,我将从我正在使用的 xml 文件中粘贴一个示例节,然后讨论我想用它做什么。

我有一个带有如下节的 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>

我正在尝试model根据. 因此,在上面的节中,我将尝试匹配and 。与之匹配后,我想放入一个列表并继续在 other 中搜索具有相同属性的其他节。mb nodevaluemb nodemodel="460"value="H61M-P25 (MS-7680)"rev="dba"mb nodes

我根本没有走多远,我一直被这些类型绊倒。我正在使用来工作。

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 回答 1

4
  1. 我认为您正在寻找该attribute功能。
  2. 通过使用>=> element "dmiattr"你说“当前元素的名称是dmiattr'。我想你可能是说&/ element "dmiattr". 但是由于你想要父级的 @rev 属性,你可能需要使用该check函数。
于 2012-11-02T02:44:47.200 回答