Python xml ElementTree findall返回空结果

时间:2016-11-08 08:49:29

标签: python xml python-2.7

我想使用Python xml ElementTree API解析以下XML文件。

paragraphs
id  story_id    user_id body
----------------------------
1   1           1       Sample data
2   1           1       Sample data
3   2           1       Sample data
4   1           2       Sample data
5   1           3       Sample data
6   5           1       Sample data

userprop
id  supervisor_id   username
----------------------------
1   1               user_abc
2   1               user_def
3   2               user_ghi

users
name        full_name
---------------------
user_abc    Jack Jackson
user_def    Bill Winters
user_ghi    Sharon Staples

supervisors
id  full_name
1   Steve Doppler
2   Frank Frampton

expected output
id  story_id    user_id body        main_supervisor_count   main_supervisor
---------------------------------------------------------------------------
1   1           1       Sample data 3                       Steve Doppler
2   1           1       Sample data 3                       Steve Doppler
3   2           1       Sample data 1                       Steve Doppler
4   1           2       Sample data 3                       Steve Doppler
5   1           3       Sample data 1                       Frank Frampton
6   5           1       Sample data 1                       Steve Doppler

在这个示例代码中,我尝试查找/ foos / foo_table / fooelem / fname下的所有元素,但显然findall在运行此代码时找不到任何内容。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<foos>

<foo_table>

<!-- bar -->
<fooelem>
 <fname>BBBB</fname>
 <group>SOMEGROUP</group>
 <module>some module</module>
</fooelem>

<fooelem>
 <fname>AAAA</fname>
 <group>other group</group>
 <module>other module</module>
</fooelem>
<!-- bar -->

</foo_table>
</foos>

我对ElementTree API没有经验,但我使用了https://docs.python.org/2/library/xml.etree.elementtree.html#example下的示例。为什么我的情况不起作用?

3 个答案:

答案 0 :(得分:1)

这是因为您使用的路径始于根元素(foos)之前。
请改用:foo_table/fooelem/fname

答案 1 :(得分:0)

foos是您的root,您需要在findall下面开始,例如。

root = tree.getroot()
for i in root.findall("foo_table/fooelem/fname"): 
    print i.text

输出:

BBBB
AAAA

答案 2 :(得分:0)

findall不起作用,但确实如此:

e = xml.etree.ElementTree.parse(myfile3).getroot()
mylist=list(e.iter('checksum'))
print (len(mylist))

mylist将具有适当的长度。