Python中的XML模块

XML(可扩展性标记语言)是一种非常常用的文件类型,主要用于存储和传输数据。在编程中,对XML的操作也非常常见。

XML格式

首先,来看一下XML所包含的元素类型

1、表情<tag>

2、属性<tag name='atrrib'>

3、数据<data>

例如一个XML文件

<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank>1</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank>4</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank>68</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>

XML操作

  • 读取

#从xml文件中读取,用getroot获取根节点,根节点也是Element对象
import xml.etree.ElementTree as Et
tree=Et.parse('xml_file.xml')#解析
root=tree.getroot()
  • 访问

  访问Element对象的标签、属性和值

tag=root.tag#标签
atrrib=root.atrrib#属性
text=toot.text#值

  访问子节点的标签、属性和值

for child in root:
    tag=child.tag#标签
    atrrib=child.atrrib#属性
    text=child.text#
  • 查找操作

  Element元素迭代子元素:Element.iter("tag"),可以罗列该节点所包含的所有其他节点(element对象)

  可以用任意一个根节点做对象

  跨节点查找

  返回迭代对象

#打印节点中所有的neighbor对象的name属性
for neighbor in root.iter('neighbor'):
     print(neighbor.attrib['name'])

  Element.findall("tag"):查找当前元素为“tag”的直接子元素

  返回的是一个list

#findall只能用来查找直接子元素,不能用来查找rank,neighbor等element
for country in root.findall('country'):
    rank = country.find('rank').text
    name = country.find('rank').text
    neig = country.find('neighbor').attrib
    print(rank, name,neig)

  Element.find("tag"):查找为tag的第一个直接子元素

  不能跨节点查找

#返回第一个tag为country的element,如没有,返回None
firstCountry = root.find("country")
print(firstCountry)

创建xml文件

import xml.etree.ElementTree as Et
#生成子节点
new_xml=Et.Element('namelist')
#生成namelist下的子节点
name=Et.SubElement(new_xml,'name',attrib={'enrolled':'yes'})
#生成name下的子节点
age=Et.SubElement(name,'age',attrib={"checked":"no"})
sex=Et.SubElement(name,'sex')
#生成sex的text
sex.text='33'

添加第二个
name2=Et.SubElement(new_xml,'name',attrib={'enrolled':'yes'})
age2=Et.SubElement(name2,'age',attrib={"checked":"no"})
sex2=Et.SubElement(name2,'sex')
sex2.text='23'

#创建Element对象
et=Et.ElementTree(new_xml)
#写入文件
et.write('test.xml',encoding='utf-8',xml_declaration=True)

 

修改xml文件

  • ElementTree.write("xmlfile"):更新xml文件
  • Element.append():为当前element对象添加子元素(element)
  • Element.set(key,value):为当前element的key属性设置value值
  • Element.remove(element):删除为element的节点
  • #读取待修改文件
    updateTree = ET.parse("test.xml")
    root = updateTree.getroot()
    #创建新节点并添加为root的子节点
    newEle = ET.Element("NewElement")
    newEle.attrib = {"name":"NewElement","age":"20"}
    newEle.text = "This is a new element"
    root.append(newEle)
    
    #修改year的Update属性
    for node in root.iter('year'):
        node.set('Update','no')
    
    #写回原文件
    updateTree.write("test.xml")

     

 

posted @ 2017-09-07 12:03  Ronny_bin  阅读(77)  评论(0)    收藏  举报