Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中解析具有多个嵌套子级的.xml文件?_Python_Xml_Parsing_Xml Parsing_Nested - Fatal编程技术网

如何在python中解析具有多个嵌套子级的.xml文件?

如何在python中解析具有多个嵌套子级的.xml文件?,python,xml,parsing,xml-parsing,nested,Python,Xml,Parsing,Xml Parsing,Nested,我正在使用python解析一个.xml文件,这个文件非常复杂,因为它有很多嵌套子文件;访问其中包含的一些值非常烦人,因为代码开始变得非常糟糕 首先让我向您展示.xml文件: 我得到的结果如下: 11111 22222 33333 44444 我想要的输出应该是这样的: 11111 22222 GIOVANNI 33333 ANDREA 44444 正如您所看到的,我能够轻松地阅读GOAL1和GOAL2,但我正在寻找一种更好的代码实践来访问这些值,因为在我看来,它太长,很难阅读/理解 我

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

首先让我向您展示.xml文件:

我得到的结果如下:

11111
22222


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

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

我想做的第二件事是以一种自动化的方式获取
GOAL3
GOAL4
,这样我就不必重复类似的代码行,并且使其更易读易懂

注意:如您所见,我无法阅读
GOAL3
。如果可能,我希望同时获得
GOAL3\u名称
GOAL3\u ID

为了使.xml文件结构更易于理解,我发布了一张它的图像:


突出显示的元素就是我要寻找的。

这里有一个简单的例子,可以使用递归方法和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)

我想从带有标记“GOAL”+str(N)的元素中获取文本,其中N是数字,对吗?从GOAL1、GOAL2、GOAL4中,我需要获取它们存储的数字:1111122223333344444。至于GOAL3,我希望得到GIOVANNI和ANDREA。我建议您在运行它时使用“for d in data.iter()”,我得到:“dict_values”对象不支持索引您使用python 3.x吗?您可以尝试将“d.attrib.values()[0]”替换为“print d.attrib[“GOAL3_NAME”]'如果只想在树上迭代而不受任何约束,则效果最佳。
11111 
22222
GIOVANNI
33333
ANDREA
44444
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)
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]