【问题标题】:How to parse xml in python deep into tags?如何将python中的xml解析为标签?
【发布时间】:2018-06-09 02:58:18
【问题描述】:

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

  1. D1 节中的 G1、G22、G15 从 D4 节中提取 PARAMCODE, 所有 IP 间隔的单位和值仅适用于“2017 年 11 月 30 日”。不要 硬编码此日期,但存储在变量中以供比较

  2. 根据日期的 IP 部分的 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)

这是我输入文件的样子

【问题讨论】:

  • Using XPath in ElementTree 可能重复。
  • @cpburnz 我想了解如何在不知道第一手或任何其他方式的 xml 结构的情况下进一步解析的详细信息。
  • 在不知道结构的情况下编写代码来解析 XML 将非常困难。另一方面,当涉及到 XML 问题时,最好发布有效 XML 的简短示例(您的内容不完整,这使得帮助您有点困难)并且必须正确格式化。

标签: python xml


【解决方案1】:

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

        </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. 

【讨论】:

  • 您的答案可以从 //D4/DAYPROFILE[@DATE="30-11-2017"] 开始而不是 //D4 ;)
  • @LuisMuñoz 好点。我看到你已经在你的答案中有这个,所以我会把它排除在我的之外。我试图就如何浏览元素而不是做整个作业问题给出更一般的答案。
  • 您的答案很好,因为它添加了 python 细节;)。 Noumi 应该能够从这两个答案中得到一些东西。对我来说这是一个 XML 问题,而不是特定于 python 的问题。
  • @LuisMuñoz 如何使用 Xpath 计算间隔,没有从这个 xmllint --xpath '//D4/DAYPROFILE[@DATE="30-11-2017"]/IP[@ INTERVAL]/PARAMETER/@PARAMCODE''input.xml'
  • XPath 有助于从 XML 代码中提取特定数据,但在 python 端计算更好。例如,您可以将@cpburnz 答案和我的答案混合起来,以获得您感兴趣的日期为“d4 = tree.find('//D4/DAYPROFILE[@DATE="30-11-2017"]')”。然后将所有间隔属性迭代为“for ip in d4.findall('IP/@INTERVAL')”并进行计算。等等。希望对您有所帮助。
【解决方案2】:

可以使用 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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多