[英]How to parse xml in python deep into tags?
我有一个XML文件,必须针对以下情况进行解析。
D1部分中的G1,G22,G15从D4部分中,仅针对“ 30-11-2017”的所有IP间隔提取PARAMCODE,UNIT和VALUE。 请勿对此日期进行硬编码,而是将其存储在变量中以进行比较
根据日期的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.