python XML
1.读取本地的XML
from xml.etree import ElementTree with open('test.xml','r',encoding='utf-8') as f: content = f.read() root = ElementTree.XML(content) # 解析的是字符串格式的xml # print(type(root)) # <class 'xml.etree.ElementTree.Element'> # print(root.tag,root.attrib) for node in root: # print(node.tag,type(node.tag),node.attrib,type(node.attrib)) #userinfo <class 'str'> {'rank': 'root'} <class 'dict'> print(node.find('username').text,node.find('password').text) for node in root.iter('userinfo'): print(node.find('username').text,node.find('password').text)
2.直接解析xml文件
from xml.etree import ElementTree tree = ElementTree.parse("test.xml") #直接解析xml文件,返回一个ElementTree # print(tree,type(tree)) #<xml.etree.ElementTree.ElementTree object at 0x0000000003692A58> <class 'xml.etree.ElementTree.ElementTree'> root = tree.getroot() #获取根节点 类型 <class 'xml.etree.ElementTree.Element'> for node in root.iter("username"): # node.text = node.text + '888' #将text 内容所有的用户名后面都增加888 node.set('id','1') #添加属性 node.set('age','19') #添加属性 del node.attrib['id'] #删除属性 tree.write('test.xml') #上述操作均在内存中,需要重新写入XML
测试用的XML
<root> <userinfo rank="putong"> <username age="19">zhangsan888</username> <password>123456</password> </userinfo> <userinfo rank="putong"> <username age="19">lisi888</username> <password>123456</password> </userinfo> <userinfo rank="super"> <username age="19">admin888</username> <password>admin</password> </userinfo> <userinfo rank="root"> <username age="19">root888</username> <password>root</password> </userinfo> </root>
3.本地生成XML
from xml.etree import ElementTree #创建根节点 root = ElementTree.Element('rootnode') #创建根节点第一个子节点 userinfo1 = ElementTree.SubElement(root,'userinfo',attrib={'checked':'no'}) name1 = ElementTree.SubElement(userinfo1,'name',attrib={'country':'cn'}) name1.text = '欧阳大侠' age1 = ElementTree.SubElement(userinfo1,'age',attrib={'rank':'child'}) age1.text='15' sex1 = ElementTree.SubElement(userinfo1,'sex') sex1.text = 'boy' #创建根节点第二个子节点 userinfo2 = ElementTree.SubElement(root,'userinfo',attrib={'checked':'yes'}) name2 = ElementTree.SubElement(userinfo2,'name',attrib={'country':'jp'}) name2.text = '山中野夫' age2 = ElementTree.SubElement(userinfo2,'age',attrib={'rank':'adult'}) age2.text='20' sex1 = ElementTree.SubElement(userinfo2,'sex') sex1.text = 'girl' # 生成文档对象 tree = ElementTree.ElementTree(root) #写入到文件 tree.write('my.xml',encoding='utf-8',xml_declaration=True)
生成的XML
<?xml version='1.0' encoding='utf-8'?> <rootnode> <userinfo checked="no"> <name country="cn">欧阳大侠</name> <age rank="child">15</age> <sex>boy</sex> </userinfo> <userinfo checked="yes"> <name country="jp">山中野夫</name> <age rank="adult">20</age> <sex>girl</sex> </userinfo> </rootnode>
4.添加节点
from xml.etree import ElementTree tree = ElementTree.parse('test.xml') root = tree.getroot() node1 = root.makeelement('newtag',{'test':'123'}) #创建一个节点 任何节点都可以创建节点 root.append(node1) #添加一个节点 node2 = ElementTree.Element('newtag2',{'aa':'bb'}) #可以直接通过类来创建 node1.append(node2) #将节点二 作为子节点添加到节点1 tree.write('out.xml',encoding='utf-8')
5.创建有缩进的xml
#创建有缩进的xml from xml.etree import ElementTree from xml.dom import minidom def xml_pretty_write(root,file_path): rough_string = ElementTree.tostring(root,'utf-8') reparsed = minidom.parseString(rough_string) pretty_string = reparsed.toprettyxml(indent="\t") with open(file_path,'w',encoding='utf-8') as f: f.write(pretty_string) xml_pretty_write(root,'pretty.xml')
6.命名空间
#!/usr/bin/env python # --*-- encoding:utf-8 --*-- from xml.etree import ElementTree #防止命名冲突 ElementTree.register_namespace('com','http://www.baidu.com') # 注册命名空间 root = ElementTree.Element('{http://www.baidu.com}root') userinfo1 = ElementTree.SubElement(root,'{http://www.baidu.com}userinfo') name1 = ElementTree.SubElement(userinfo1,'{http://www.baidu.com}name',{'{http://www.baidu.com}checked':'yes'}) name1.text = '张三' tree = ElementTree.ElementTree(root) # tree.write('namespace.xml',encoding='utf-8',xml_declaration=True,method='xml')
<?xml version='1.0' encoding='utf-8'?> <com:root xmlns:com="http://www.baidu.com"> <com:userinfo> <com:name com:checked="yes">张三</com:name> </com:userinfo> </com:root>

浙公网安备 33010602011771号