python中解析简单的xml文档

**

xml是一种十分常见的表机性语言,可提供统一的方法来描述应用程序的结构化数据。

**

<?xml version="1.0"?>
<data>
    <country name="zz">
        <rank update="yes">2</rank>
        <year>2016</year>
        <gdbc>1500</gdbc>
        <neighbor name="zn"></neighbor>
        <neighbor name="zl"></neighbor>
    </country>
</data>

那么在python当中如何解析xml文档呢?
我们可以使用标准库中的xml.etree.ElementTree,其中的parse函数可以解析xml文档。

from xml.etree.ElementEtree  import parse #导入这个函数

parse这个函数有两个参数parse(source,parse=None)
可以把上面这个xml文件作为source也就是输入元。

f = open('demo.xml')
et = parse(f) #得到一个元素树,至此我们就可以对这个元素树进行下一步的操作了。
root =et.getroot  #获取元素树的根节点
root
=> <Element 'data' at 0x7fe053b0d90>  #得到一个元素对象
root.tag
=>'data'
root.attrib
=>{}  #得到一个字典
root.text
=>'\n\t'  
root.text.strip()
=>''
root.getchildren   #获取root节点的子元素。
=>  <Element 'country' at 0x7fe0503b0dd0>  #  但是这是一个即将被删除的属性,尽量避免使用它。
for child in root:
    print child.get('name')         #通过遍历来找它的子元素的name属性值
=> zz
root.find('country')  # 通过寻找标签的名字来获取子元素,此方法总返回找到的第一个标签
=> <Element 'country' at  0x7fe0503b0dd0>
root.findall('country')
[ <Element 'country' at 0x7fe0503b0dd0> 
 <Element 'country' at 0x7fe0503b0ed0> 
 <Element 'country' at 0x7fe0503b0fd0> 
] #此方法返回的是一个列表,如想获取一个可迭代对象
root.iterfind('country')
=>  <generator object select at 0x7fe050ceedd0 > #得到一个生成器对象,然后迭代它
for e in root.iterfind('country'):print e.get('name')
=> zz

此处注意。上面的方法都只是适用于root这个根节点的直接子元素,也就是country。然而对country的子元素,<rank>..无效。
那么非要找到<rank>怎么办

root.iter() #得到一个生成器对象,包括旗下的所有元素
list(root.iter())
=> [ <Element 'data' at 0x7fe0503b0dd0> 
 <Element 'country' at 0x7fe0503b0ed0> 
 <Element 'rank' at 0x7fe0503b0fd0> 
<Element 'year' at 0x7fe0504b0ed0> 
 <Element 'gdbc' at 0x7fe0553b0fd0> 
<Element 'neighbor' at 0x7ff0503b0ed0> 
<Element 'neighbor' at 0x7ff0513b0ed0>
] #有多少元素返回多少,元素名字可以重复。
list(root.iter('neighbor'))
=>[<Element 'neighbor' at 0x7ff0503b0ed0> 
<Element 'neighbor' at 0x7ff0513b0ed0>
]

关于查找还有一些高级的方法,也就是模糊匹配。语法类似XPATH

root.findall('country/*') # *找到旗下的所有元素
=>[
 <Element 'rank' at 0x7fe0503b0fd0> 
<Element 'year' at 0x7fe0504b0ed0> 
 <Element 'gdbc' at 0x7fe0553b0fd0> 
<Element 'neighbor' at 0x7ff0503b0ed0> 
<Element 'neighbor' at 0x7ff0513b0ed0>]
root.findall('rank')
=> []
root.findall('.//rank')  # //找到任意层次的元素
=> [<Element 'rank' at 0x7fe0503b0fd0> ]
root.findall('.//rank..')  # .. 找父节点的元素  .找当前元素下的
=>[
 <Element 'country' at 0x7fe0503b0ed0>
]
root.findall('country[@name="zz"]')  # 找到包含属性name并且值为zz
=> [<Element 'country' at 0x7fe0503b0ed0>]

关于高级查找更多的用法,可以去看看官方的API。

over!!

点赞