我正在使用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
,但我正在寻找一种更好的代码练习来访问这些值,因为在我看来它太长而且难以阅读/理解
我想要做的第二件事是以自动方式获取GOAL2
和GOAL3
,这样我就不必重复类似的代码行,使其更具可读性和可理解性。
注意:正如您所看到的,我无法阅读GOAL4
。如果可能,我希望获得GOAL3
和GOAL3_NAME
为了使.xml文件结构更容易理解,我发布了一个图像:
突出显示的元素是我正在寻找的。 p>
答案 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]