对于这个问题,我将从我正在使用的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
mb
中属性node
的值以及第一个子元素中第二个元素的value
属性来查找节。 mb
node
。因此,在上面的节中,我将尝试匹配model="460"
和value="H61M-P25 (MS-7680)"
。与之匹配后,我想将rev="dba"
放入列表中,并继续在其他mb
nodes
中搜索具有相同属性的其他节。
我没有走得太远,我一直在绊倒这些类型。我正在使用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
属性。
所以,当我玩上面的内容时,我最终得到一个空列表,垃圾字符或类型错误。任何帮助将不胜感激。
答案 0 :(得分:4)
attribute
功能。>=> element "dmiattr"
,您说“当前元素的名称为dmiattr
”。我认为您的意思可能是&/ element "dmiattr"
。但由于您需要父级的@rev属性,您可能需要使用check
函数。