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>

 

posted @ 2017-04-27 18:17  1916  阅读(137)  评论(0)    收藏  举报