您的位置:首页 > 编程语言 > Python开发

python—xml读写—minidom and etree

2014-05-02 01:25 435 查看
test.xml

<?xml version="1.0" encoding="UTF-8"?>
<employees>
<employee id="0">
<name>Liu</name>
<age>30</age>
</employee>
<employee id="1">
<name>John</name>
<age>20</age>
</employee>
</employees>


1. minidom

from xml.dom import minidom
from codecs import open
if __name__ == '__main__':
#用xml.dom.minidom读xml
doc=minidom.parse('test.xml')
root=doc.documentElement #得到根节点——employees
employees=root.getElementsByTagName('employee') #根据名字来查找子elements
for employee in employees:
print ("id:"+employee.getAttribute('id')) #获得属性值
name=employee.getElementsByTagName('name')[0] #childNodes返回所有的子Nodes,其中所有的文本均为textNode,包括元素间的‘\n\r’和空格均
print(name.nodeName+":"+name.childNodes[0].nodeValue) #nodeValue是结点的值,只对textNode有效
age=employee.getElementsByTagName('age')[0]
print(age.nodeName+":"+age.childNodes[0].data) #对于textNode,得到文本内容也可以使用.data

#用xml.dom.minidom写xml
impl=minidom.getDOMImplementation()
doc=impl.createDocument(None, 'employees', None) #创建根节点——employees
root=doc.documentElement
employee=doc.createElement('employee') #创建employee节点
employee.setAttribute('id', '0') #设置id属性
root.appendChild(employee)

namenode=doc.createElement('name') #创建name节点
nametext=doc.createTextNode('刘') #创建textnode
namenode.appendChild(nametext)
employee.appendChild(namenode)

agenode=doc.createElement('age')
agetext=doc.createTextNode('30')
agenode.appendChild(agetext)
employee.appendChild(agenode)

f=open('write.xml','w',encoding='utf-8')
#addindent表示子元素缩进,newl='\n'表示元素间换行,encoding='utf-8'表示生成的xml的编码格式(<?xml version="1.0" encoding="utf-8"?>)
doc.writexml(f, addindent='  ', newl='\n', encoding='utf-8')


输出结果:

id:0
name:Liu
age:30
id:1
name:John
age:20


write.xml:

<?xml version="1.0" encoding="utf-8"?>
<employees>
<employee id="0">
<name>刘</name>
<age>30</age>
</employee>
</employees>


2. etree

from xml.etree import ElementTree

#打印节点信息
def print_node(node):
print "-------------------------------"
print "attrib:%s" %node.attrib #属性的字典
print "id:%s" %node.attrib['id'] #指定的属性值
for key,value in node.items(): #items:属性(name, value)对儿
print "%s:%s" %(key,value)
for child in node:
print "tag:%s" %child.tag
print "text:%s" %child.text

#读xml
def readxml(text='',xmlfile=''):
#root=ElementTree.parse('test.xml').getroot() #加载指定文件获得根节点
root=ElementTree.fromstring(text) #加载指定字符串获得根节点

employees=root.iter('employee') #通过iter(tag=None)获取element
for employee in employees:
print_node(employee)

for employee in root.findall('employee'): #findall:匹配的直接子节点
print "-------------------------------"
age=employee.find('age').text #find:第一个匹配的
id=employee.get('id') #得到属性值
print age,id

#更改xml
def updatexml(text='',xmlfile=''):
tree=ElementTree.parse(xmlfile) #加载指定文件
root=tree.getroot() #获得根节点
for age in root.iter('age'): #获得所有age节点
newage=int(age.text)+1
age.text=str(newage)
age.set('updated','yes') #设置属性-值

name=root[0].find('name')
root[0].remove(name) #移除节点
#创建节点
employee=ElementTree.Element('employee',{'id':'99'}) #Element(tag, attrib={}, **extra)
name=ElementTree.SubElement(employee, 'name') #SubElement(parent, tag, attrib={}, **extra)
name.text='新'
age=ElementTree.SubElement(employee,'age')
age.text='99'
root.append(employee)

#write(file, encoding="us-ascii", xml_declaration=None, default_namespace=None, method="xml")
tree.write('updated.xml',encoding='utf-8')

if __name__ == '__main__':
readxml(open('test.xml').read())
updatexml('','test.xml')


输出结果:

-------------------------------
attrib:{'id': '0'}
id:0
id:0
tag:name
text:Liu
tag:age
text:30
-------------------------------
attrib:{'id': '1'}
id:1
id:1
tag:name
text:John
tag:age
text:20
-------------------------------
30 0
-------------------------------
20 1


update.xml:

<employees>
<employee id="0">
<age updated="yes">31</age>
</employee>
<employee id="1">
<name>John</name>
<age updated="yes">21</age>
</employee>
<employee id="99"><name>新</name><age>99</age></employee></employees>


用SubElement好像没法换行?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python xml minidom etree