在Python中使用ElementTree解析XML

时间:2014-03-13 01:44:26

标签: python xml parsing xml-parsing elementtree

我有这样的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并提取<value>条目,该条目位于标有&#39; swisspro&#39;的<name>条目下方。即我想解析并提取Q8H6N2&#39; Q8H6N2&#39;值。

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

2 个答案:

答案 0 :(得分: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元素

希望有所帮助。

答案 1 :(得分: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())