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

2024-04-18 19:48:03 发布

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

我有一个XML文件,它必须被解析为以下条件。你知道吗

  1. D1段G1、G22、G15从D4段中提取参数代码, 所有IP间隔的单位和值仅适用于“30-11-2017”。不要 硬编码此日期,但存储在变量中进行比较

  2. 根据该日期IP段的间隔值计算时间值。 例如,如果间隔=1,时间=00:30:00,增量为30分钟。 如果间隔=2,时间=01:00:00,如果间隔=3,时间=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)

这是我的输入文件


Tags: 文件ipnodetree参数间隔时间xml
2条回答

首先,我们需要添加您丢失的结束标记:

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

现在,您可以使用^{} 或者^{} 方法(.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. 

对于PARAMCODE属性,可以使用XPath获取值,例如(Linux命令行、XPath works或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'

相关问题 更多 >