操作XML有两种方法:DOM和SAX。DOM会把整个XML读入内存,解析为树,因此占用内存大,解析慢,优点是可以任意遍历树的节点。
SAX是流模式,边读边解析,占用内存小,解析快,缺点是我们需要自己处理事件。正常情况下,优先考虑SAX,因为DOM实在太占内存。
python还提供了独特的解析xml的方法,相比于SAX,DOM更容易使用和更加快速,此方法为ElementTree。ElementTree可以看成是一个轻量级的DOM,具有方便友好的API,其代码可用性好,速度快,消耗内存少。ElementTree表示整个xml文件即是一个树形结构;Element表示树中的一个元素(节点)
一、生成xml文件
1、Element(tag, attrib={},
**extra)函数用来构造XML的一个根节点,其中tag表示根节点的名称,attrib是一个可选项,表示节点的属性。
2、SubElement(parent, tag, attrib={}, **extra)用来构造一个已经存在的节点的子节点
Element.text和SubElement.text表示element对象的额外的内容属性,Element.tag和Element.attrib分别表示element对象的标签和属性。
from xml.etree import ElementTree as ET
def build_sitemap():
urlset =
ET.Element("urlset") #设置一个根节点,标签为urlset
url =
ET.SubElement(urlset,"url")
#在根节点urlset下建立子节点
loc =
ET.SubElement(url,"loc")
loc.text =
"http://www/baidu.com" #子节点的赋值内容
lastmod =
ET.SubElement(url,"lastmod")
lastmod.text =
"2017-10-10"
changefreq =
ET.SubElement(url,"changefreq")
changefreq.text =
"daily"
priority =
ET.SubElement(url,"priority")
priority.text =
"1.0"
tree =
ET.ElementTree(urlset)#初始化一个ElementTree对象,需要传入根节点标签
tree.write("sitemap.xml")#新建一个xml文件,并将节点数据写入该文件中
if __name__ == '__main__':
build_sitemap()
其结果可在sitemap.xml文档中查看,如下图所示:
二、解析xml文件
#Element.remove(tag)删除名称为tag的子节点
#打开一个xml文件,本地文件使用open函数,互联网文件使用urlopen
f=open('sitemap.xml','rt')
#解析根元素
tree=ET.parse(f)#加载xml文档,并返回ElementTree对象
root=tree.getroot()#得到根节点,返回根节点的Element对象
print 'root.tag=',root.tag#获得根节点的标签
print 'root.attrib=',root.attrib#获取根节点的属性
url=tree.find('url')#得到第一个匹配的标签(tag)为url的子节点
#解析根的儿子,而不能解析出root的子孙
for child in root:
print child.tag
print
child.attrib#属性attrib是一个字典
#通过索引解析根的子孙
print root[0][1].tag ,
root[0][1].text#从根节点一下开始,第一个子节点索引0开始
#迭代解析出所有的指定element
for element in root.iter('loc'):
print element.text
for evironment in root.findall('url '):#解析指定element的所有儿子
first_variable=evironment.find('url' )#解析出element的第一个儿子
print
first_variable.get('url')#解析出指定element的属性的attrib
#修改xml文件
for test in root.iter('lastmod'):
test.set('time','17:08')#为lastmod增加新的属性
test.text='2018-3-3'#修改其text
test.append(ET.Element('data',attrib={},text='2018/03/01'))#添加一子元素,并给出属性与文本内容
tree.write('output.xml')
可在output.xml文件中查看修改的情况,如下图所示: