如何将python中的xml深深解析为标签?

时间:2017-12-28 14:48:06

标签: python xml

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

  1. 第D1节中的G1,G22,G15从D4部分,提取PARAMCODE,     所有IP INTERVAL的单位和价值仅适用于" 30-11-2017"。不要     硬编码此日期,但存储在变量中以进行比较

  2. 从日期的IP部分的INTERVAL值计算时间值。     例如如果interval = 1,TIME = 00:30:00并且增加30分钟。     如果INTERVAL = 2,TIME = 01:00:00,如果INTERVAL = 3 TIME = 01:30:00那么     上。

  3. 我能够解析到它的主目录但不能深入了解     进一步。谁能帮我这个。 这是我尝试过的。

    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)
    

    这是我的输入文件,如

2 个答案:

答案 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.