在Python中使用ElementTree解析XML

1 投票
2 回答
1353 浏览
提问于 2025-04-17 22:03

我有这样的XML:

<parameter>
 <name>ec_num</name>
 <value>none</value>
 <units/>
 <url/>
 <id>2455</id>
 <m_date>2008-11-29 13:15:14</m_date>
 <user_id>24</user_id>
 <user_name>registry</user_name>
</parameter>
<parameter>
 <name>swisspro</name>
 <value>Q8H6N2</value>
 <units/>

我想解析这个XML,并提取出在标记为'swisspro'的<name>下面的<value>内容。也就是说,我想提取出'Q8H6N2'这个值。

我该如何使用ElementTree来做到这一点呢?

2 个回答

0

这里有一个例子:

xml 文件

<span style="font-size:13px;"><?xml version="1.0" encoding="utf-8"?>
<root>
 <person age="18">
    <name>hzj</name>
    <sex>man</sex>
 </person>
 <person age="19" des="hello">
    <name>kiki</name>
    <sex>female</sex>
 </person>
</root></span>

解析方法

from xml.etree import ElementTree
def print_node(node):
    '''print basic info'''
    print "=============================================="
    print "node.attrib:%s" % node.attrib
    if node.attrib.has_key("age") > 0 :
        print "node.attrib['age']:%s" % node.attrib['age']
    print "node.tag:%s" % node.tag
    print "node.text:%s" % node.text
def read_xml(text):
    '''read xml file'''
    # root = ElementTree.parse(r"D:/test.xml")  #first method
    root = ElementTree.fromstring(text)  #second method

    # get element
    # 1 by getiterator 
    lst_node = root.getiterator("person")
    for node in lst_node:
        print_node(node)

    # 2 by getchildren
    lst_node_child = lst_node[0].getchildren()[0]
    print_node(lst_node_child)

    # 3 by .find
    node_find = root.find('person')
    print_node(node_find)

    #4. by findall
    node_findall = root.findall("person/name")[1]
    print_node(node_findall)

if __name__ == '__main__':
     read_xml(open("test.xml").read())
1

lxml 来做这件事会简单很多,不过这里有一个用 ElementTree 库的解决方案:

import xml.etree.ElementTree as ET

data = """<parameters>
<parameter>
 <name>ec_num</name>
 <value>none</value>
 <units/>
 <url/>
 <id>2455</id>
 <m_date>2008-11-29 13:15:14</m_date>
 <user_id>24</user_id>
 <user_name>registry</user_name>
</parameter>
<parameter>
 <name>swisspro</name>
 <value>Q8H6N2</value>
 <units/>
</parameter>
</parameters>"""

tree = ET.fromstring(data)

for parameter in tree.iter(tag='parameter'):
    name = parameter.find('name')
    if name is not None and name.text == 'swisspro':
        print parameter.find('value').text
        break

输出结果是:

Q8H6N2

这个思路很简单:遍历所有的 parameter 标签,检查 name 标签的值,如果它等于 swisspro,就获取 value 元素。

希望这对你有帮助。

撰写回答