2014-03-13 63 views
1

我有這樣的XML:與解析XML ElementTree的Python中

<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>項,這僅低於<name>進入標有「SWISSPRO」。即我想解析並提取'Q8H6N2'值。

我該如何使用ElementTree來做到這一點?

回答

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元素。

希望有所幫助。

+0

它有很多幫助 - 謝謝! – Charon

+0

我不喜歡你的答案。我得到這個錯誤: 回溯(最近通話最後一個): 文件 「xmlextractor.py」 17行,在 在counts.iter NUM(標籤= '註釋'): AttributeError的: '名單' 對象沒有屬性'iter' – lopezdp

+0

@lopezdp如果你不能應用該解決方案,並不意味着它是錯誤的。如果您需要幫助,請考慮創建一個單獨的問題。謝謝。 – alecxe

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())