minidom的python XML解析问题

2024-09-30 22:27:46 发布

您现在位置:Python中文网/ 问答频道 /正文

谁能告诉我解析xml文档的最佳方法是什么

我的XML文件如下所示。XML标记在每个块上都不一致,我的脚本失败了,因为它无法在所有迭代中找到密钥。我正在使用minidom

<Header version=test>
  <pool name="A">
     <pooltier name="1"></pooltier>
     <pooltier name="2"></pooltier>
     <pooltier name="3"></pooltier>
  </pool>
  <pool name="B">
     <pooltier name="1"></pooltier>
     <pooltier name="2"></pooltier>
     <pooltier name="3"></pooltier>
  </pool>
     <pool name="C">"No PoolTier Here"
  </pool>
</Header>

并非所有的“池”都有“池层”

我的代码片段:

pools = xmldoc.getElementsByTagName('Pool')
    for poolname in pools:
        print(poolname.attributes['name'].value)
        print(poolname.attributes['poolID'].value)
        poolnam = poolname.attributes['name'].value
        poolnum = poolname.attributes['poolID'].value
        pooluse = poolname.attributes['usageRate'].value

        pooltiers = xmldoc.getElementsByTagName('PoolTier')
        print(xmldoc.getElementsByTagName('PoolTier'))
        for tiername in pooltiers:
            Tid = tiername.attributes['tierID'].value
            capKB = tiername.attributes['capacityInKB'].value
            FreeKB = tiername.attributes['freeCapacityInKB'].value
            Usage = tiername.attributes['usageRate'].value
            raid = tiername.attributes['raidLevel'].value
            rpmval = tiername.attributes['rpm'].value
            dtype = tiername.attributes['diskType'].value
            print(tiername.attributes['tierID'].value)
            #print(tiername.attributes['capacityInKB'].value)
            #print(tiername.attributes['freeCapacityInKB'].value)
            #print(tiername.attributes['usageRate'].value)
            #print(tiername.attributes['raidLevel'].value)
            #print(tiername.attributes['rpm'].value)
            print(tiername.attributes['diskType'].value)



            if dtype == "5":
                dtype = "FMC"
                #print (poolname.attributes['basicUsableFMCCapacityTotal'].value)
                capKB = poolname.attributes['basicUsableFMCCapacityTotal'].value
                UsedFMC = poolname.attributes['basicUsableFMCCapacityUsed'].value
                FreeKB = int(capKB) - int(UsedFMC)
                FMCUsage = float(UsedFMC)/float(capKB) * 100
                Usage = int(FMCUsage)

            elif dtype == "4":
                dtype = "SAS"
            else:
                dtype = "Unknown"

问题是,即使它遇到一个没有pooltier的池,它也会进入“if dtype==5”并以“KeyError:'basicUsableFMCCapacityTotal'失败”


Tags: namevalueattributesprintpooldtypegetelementsbytagnamexmldoc