如何解析python中多个嵌套子项的.xml文件?

时间:2016-11-16 09:35:19

标签: python xml parsing xml-parsing nested

我正在使用python来解析一个非常复杂的 .xml 文件,因为它有很多嵌套子项;访问它中包含的一些值非常烦人,因为代码开始变得很糟糕。

让我先向您介绍 .xml 文件:

JSONStore

我的目标是以更好的方式访问名为“GOAL”的子项中包含的值,然后是我在下面的示例代码中编写的值。此外,我想找到一种自动方式来查找具有相同类型标签的GOALS值,这些标签属于具有相同名称的不同子项:

示例:GIOVANNI和ANDREA属于同一类型的标记(<?xml version="1.0" encoding="utf-8"?> <Start> <step1 stepA="5" stepB="6" /> <step2> <GOAL1>11111</GOAL1> <stepB> <stepBB> <stepBBB stepBBB1="pinco">1</stepBBB> </stepBB> <stepBC> <stepBCA> <GOAL2>22222</GOAL2> </stepBCA> </stepBC> <stepBD>-NO WOMAN NO CRY -I SHOT THE SHERIF -WHO LET THE DOGS OUT </stepBD> </stepB> </step2> <step3> <GOAL3 GOAL3_NAME="GIOVANNI" GOAL3_ID="GIO"> <stepB stepB1="12" stepB2="13" /> <stepC>XXX</stepC> <stepC> <stepCC> <stepCC GOAL4="saf12">33333</stepCC> </stepCC> </stepC> </GOAL3> </step3> <step3> <GOAL3 GOAL3_NAME="ANDREA" GOAL3_ID="DRW"> <stepB stepB1="14" stepB2="15" /> <stepC>YYY</stepC> <stepC> <stepCC> <stepCC GOAL4="fwe34">44444</stepCC> </stepCC> </stepC> </GOAL3> </step3> </Start> ),属于具有相同名称(GOAL3_NAME)的不同子项。

这是我写的代码:

<step3>

,我得到的输出如下:

import xml.etree.ElementTree as ET
data = ET.parse('test.xml').getroot()

GOAL1 = data.getchildren()[1].getchildren()[0].text
print(GOAL1)

GOAL2 = data.getchildren()[1].getchildren()[1].getchildren()[1].getchildren()[0].getchildren()[0].text
print(GOAL2)

GOAL3 = data.getchildren()[2].getchildren()[0].text
print(GOAL3)

GOAL4_A = data.getchildren()[2].getchildren()[0].getchildren()[2].getchildren()[0].getchildren()[0].text
print(GOAL4_A)

GOAL4_B = data.getchildren()[3].getchildren()[0].getchildren()[2].getchildren()[0].getchildren()[0].text
print(GOAL4_B) 

我想要的输出应该是这样的:

11111
22222


33333
44444

正如您所看到的,我能够轻松阅读11111 22222 GIOVANNI 33333 ANDREA 44444 GOAL1,但我正在寻找一种更好的代码练习来访问这些值,因为在我看来它太长而且难以阅读/理解

我想要做的第二件事是以自动方式获取GOAL2GOAL3,这样我就不必重复类似的代码行,使其更具可读性和可理解性。

注意:正如您所看到的,我无法阅读GOAL4。如果可能,我希望获得GOAL3GOAL3_NAME

为了使.xml文件结构更容易理解,我发布了一个图像:

enter image description here

突出显示的元素是我正在寻找的。

2 个答案:

答案 0 :(得分:1)

这里是使用递归方法和cElementTree(15-20倍更快)从头到尾迭代的简单示例,您可以从中收集所需的信息

import xml.etree.cElementTree as ET
tree = ET.parse('test.xml')
root = tree.getroot()
def get_tail(root):
    for child in root:
        print child.text
        get_tail(child)
get_tail(root)

答案 1 :(得分:1)

import xml.etree.cElementTree as ET
data = ET.parse('test.xml')    
for d in data.iter():
       if d.tag in ["GOAL1", "GOAL2", "stepCC", "stepCC"]:
          print d.text
       elif d.tag in ["GOAL3", "GOAL4"]:
          print d.attrib.values()[0]