与解析XML ElementTree的Python中
问题描述:
我有这样的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来做到这一点?
答
它会被更容易地通过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
元素。
希望有所帮助。
答
下面是一个例子: 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())
它有很多帮助 - 谢谢! – Charon
我不喜欢你的答案。我得到这个错误: 回溯(最近通话最后一个): 文件 “xmlextractor.py” 17行,在 在counts.iter NUM(标签= '注释'): AttributeError的: '名单' 对象没有属性'iter' –
lopezdp
@lopezdp如果你不能应用该解决方案,并不意味着它是错误的。如果您需要帮助,请考虑创建一个单独的问题。谢谢。 – alecxe