Python ElementTree解析顺序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python ElementTree解析顺序相关的知识,希望对你有一定的参考价值。

我有一个非常新手的问题,但我刚刚开始,这个问题困扰着我的大脑。

这是我的XML:

<SCHEDULE>
  <PROGRAMMES>
    <PROGRAMME START="00:30:00" END="00:31:00">
      <TITLES>
        <TITLE>Name 1</TITLE>
      </TITLES>
    </PROGRAMME>
    <PROGRAMME START="00:31:00" END="00:32:00">
      <BLOCK>
        <BLOCK_NAME>Block1</BLOCK_NAME>
        <BLOCK_START>00:31:00</BLOCK_START>
      </BLOCK>
      <TITLES>
        <TITLE>Name 2</TITLE>
      </TITLES>
    </PROGRAMME>
    <PROGRAMME START="00:40:00" BILLEDEND="00:45:00">
      <BLOCK>
        <BLOCK_NAME>Block 1</BLOCK_NAME>
        <BLOCK_START>00:31:00</BLOCK_START>
      </BLOCK>
      <TITLES>
        <TITLE>Name 3</TITLE>
      </TITLES>
    </PROGRAMME>
    <PROGRAMME START="00:45:00" END="00:50:00">
      <TITLES>
        <TITLE>Name 4</TITLE>
      </TITLES>
    </PROGRAMME>
  </PROGRAMMES>
</SCHEDULE>

这是我的Python代码:

import xml.etree.ElementTree as ET

try:
    import textwrap
    textwrap.indent
except AttributeError: 
    def indent(text, amount, ch=' '):
        padding = amount * ch
        return ''.join(padding+line for line in text.splitlines(True))
else:
    def indent(text, amount, ch=' '):
        return textwrap.indent(text, amount * ch)

tree= ET.parse("block.xml")
root=tree.getroot()

for sub in root.findall('.//PROGRAMME'):

    time = sub.get("START")[:5] + " "
    nas = sub.find(".//TITLE").text

    if sub.find(".//BLOCK_NAME") == None:
        block = time + nas
    else:
        block = sub.find(".//BLOCK_NAME").text
        c= indent(time + nas,3)
        block = time + block + "
" + c

    print(block)

结果我得到:

>>>00:30 Name 1
>>>00:31 Block1
>>>   00:31 Name 2
>>>00:40 Block 1
>>>   00:40 Name 3
>>>00:45 Name 4

现在的问题是:我错过了什么,所以我会得到这个结果

>>>00:30 Name 1
>>>00:31 Block1
>>>   00:31 Name 2
>>>   00:40 Name 3
>>>00:45 Name 4

我认为我需要以某种方式合并BLOCK_START,但我不知道如何... Tnx提前寻求帮助

答案

我自己想出来了。刚刚比较了START和STARTBLOCK。

if sub.find(".//BLOCK_NAME") is None:
    block = time + nas
else:
    if sub.find(".//BLOCK_START").text != sub.get("START"):
        block = indent(time + nas, 4)
    else:
        block = sub.find(".//BLOCK_NAME").text
        c = indent(time + nas, 4)
        block = time + block + "
" + c

以上是关于Python ElementTree解析顺序的主要内容,如果未能解决你的问题,请参考以下文章

使用 xml.etree.ElementTree 在 python 中解析 XML

如何使用 python xml.etree.ElementTree 解析 eBay API 响应?

使用Python和ElementTree解析XML

python 使用ElementTree解析xml

python xml解析之 xml.etree.ElementTree

使用 ElementTree 示例在 Python 中解析 XML