我有一个XML文件,必须针对以下条件进行解析。
第D1节中的G1,G22,G15从D4部分,提取PARAMCODE, 所有IP INTERVAL的单位和价值仅适用于" 30-11-2017"。不要 硬编码此日期,但存储在变量中以进行比较
从日期的IP部分的INTERVAL值计算时间值。 例如如果interval = 1,TIME = 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)
这是我的输入文件,如
答案 0 :(得分:1)
可以使用XPath获取值,如此(Linux命令行,XPath也可以是python)或PARAMCODE属性
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'
答案 1 :(得分:0)
首先,我们需要添加您缺少的结束标记:
</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.