2016-11-16 73 views
0

我使用python解析.xml这个文件很复杂,因为它有很多嵌套的子节点;访问其中包含的一些值是非常烦人的,因为代码开始变得非常糟糕。如何在python中分析带有多个嵌套子元素的.xml文件?

让我先为您呈现的.xml文件

<?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> 

我的目标将是访问包含在那么更好的方式同我在写一个名为“GOAL”的孩子内的值我的示例代码如下。此外,我想找到一种自动方式来查找具有相同类型标签的GOALS的值,该标签属于具有相同名称的不同儿童:

例如:GIOVANNI和ANDREA都使用相同类型的标签(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 

正如您所看到的,我可以轻松读取GOAL1GOAL2我正在寻找更好的代码实践来访问这些值,因为它在我看来太长而且难以阅读/理解。

我想要做的第二件事是以自动化的方式获得GOAL3GOAL4,这样我就不必重复类似的代码行,并使其更易于理解。

注意:您可以看到我无法读取GOAL3。如果可能的话,我想同时获得GOAL3_NAMEGOAL3_ID

为了使.xml文件结构更加理解我的后是什么样子的图像:

enter image description here

高亮元素我在找什么。

+0

所需要的信息,我说得对不对,你希望从标签为“GOAL”+ str(N)的元素获得文本,其中N是数字?来自GOAL1,GOAL2,GOAL4的 –

+0

我需要得到他们存储的数字:11111,22222,33333,444444.至于GOAL3,我想要GIOVANNI和ANDREA。 –

+0

我建议您在data.iter()中使用“for d” –

回答

1

这里是从头部到迭代用尾递归方法和cElementTree(15-20x更快)简单的例子,你可以比收集从

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) 
+0

如果您只是想在没有任何约束的情况下遍历树,则效果最好。 –

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] 
+0

当我运行它时,我得到:'dict_values'对象不支持索引 –

+0

你使用python 3.x吗? –

+0

你可以尝试从'd.attrib.values()[0]'替换为'打印d.attrib [“GOAL3_NAME”]' –

相关问题