python—xml读写—minidom and etree

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好像没法换行?



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值