繁体   English   中英

如何解析python中的xml到标签中?

[英]How to parse xml in python deep into tags?

我有一个XML文件,必须针对以下情况进行解析。

  1. D1部分中的G1,G22,G15从D4部分中,仅针对“ 30-11-2017”的所有IP间隔提取PARAMCODE,UNIT和VALUE。 请勿对此日期进行硬编码,而是将其存储在变量中以进行比较

  2. 根据日期的IP部分的INTERVAL值计算时间值。 例如,如果间隔= 1,时间= 00:30:00并以30分钟为增量。 如果INTERVAL = 2,TIME = 01:00:00,如果INTERVAL = 3 TIME = 01:30:00,依此类推。

我能够解析到其主目录,但无法进一步深入了解。 谁能帮我这个。 这是我尝试过的。

from xml.etree import ElementTree 
with open('input.XML', 'rt') as f:
tree = ElementTree.parse(f)
for node in tree.iter():
print(node.tag, node.attrib)

这是我的输入文件,看起来像

可以使用XPath来获取值,例如PARAMCODE属性的Linux命令行,XPath或python一样。

xmllint --xpath '//D4/DAYPROFILE[@DATE="30-11-2017"]/IP[@INTERVAL]/PARAMETER/@PARAMCODE' your_file.xml

输出样本:

PARAMCODE="P7-3-5-2-0" PARAMCODE="P7-1-5-2-0" PARAMCODE="P7-2-1-2-0" PARAMCODE="P7-2-4-2-0" PARAMCODE="P1-2-1-4-0"

然后,您可以使用这些值进行任何计算。 如果您希望interval = 1,则XPath可以是:

'//D4/DAYPROFILE[@DATE="30-11-2017"]/IP[@INTERVAL="1"]/PARAMETER/@PARAMCODE'

首先,我们需要添加缺少的结束标记:

        </IP>
      </DAYPROFILE>
    </D4>
  </UTILITYTYPE>
</CDF>

现在,您可以使用.find().findall()方法( .find()将返回单个元素,而.findall()将返回多个元素)。 查找元素的语法有点奇怪,但这应该可以工作:

d1 = tree.find('.//D1') # D1 is a decendant of the tree.
d4 = tree.find('.//D4') # D4 is a decendant of the tree.

在这里,您可以找到G值:

g1 = d1.find('G1') # G1 is a direct child of D1.
g1_value = g1.text

# Handle the value however you need, and do something similar for the
# remaining G elements.

现在查找您的IP值:

for ip in d4.findall('.//IP'): # IPs are decendants of D4.
    # Get each parameter.
    for param in ip.findall('PARAMETER'): # PARAMETERs are direct children of IPs.
        # Get parameter attributes.
        param_code = param.attrib['PARAMCODE']
        param_value = param.attrib['VALUE']
        param_unit = param.attrib['UNIT']

        # Handle the IP parameters.

    # Handle any final things for the IP element. 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM