#! /usr/bin/env python
# -*- coding:utf-8 -*-
import xml
import requests
from xml.etree import ElementTree as et
## 1.以字符串方式读取xml文件
page = open('blog.xml','r',encoding='utf-8').read()
root = et.XML(page)
print(root.tag)# 当前节点的标签名 tag
for node in root:
print(node.tag,node.attrib,node.find('year').text)
#当前节点的属性 attrib
#当前节点的内容 text
##2.以解析文件方式打开文件,可修改文件内容
## 对象都是由类创建的,方法都在类中
## tree---->1.由ElementTree类创建 ElementTree(xxx)
## 创建有两种方式:et.parse(文件路径),et.ElementTree(根节点)
## 2.getroot() 获取根节点
## 3.write() 将内存中的xml写入文件
tree = et.parse('blog.xml')
rot = tree.getroot()
for nod in rot.iter('year'):
new_year = int(nod.text)+1
nod.text = str(new_year)
# set(self, key, value):设置属性
# get(self, key, default=None):获取当前节点的属性值
nod.set('name','NF')
# 删除属性
del nod.attrib['name']
print(dir(rot))# 查看本层节点下有哪些方法
# append(self, subelement):为当前节点追加一个子节点
# extend(self, elements):为当前节点扩展 n 个子节点
# insert(self, index, subelement):在当前节点的子节点中插入某个节点,
# 即:为当前节点创建子节点,然后插入指定位置
# remove(self, subelement):在当前节点在子节点中删除某个节点
# findall(self, path, namespaces=None):获取所有的子节点
# iterfind(self, path, namespaces=None):
# 获取所有指定的节点,并创建一个迭代器(可以被for循环)
# clear(self):清空节点
#
tree.write('blog.xml')
##3.创建xml文件
#创建节点有三种方式(节点都是Element对象类型):
##1)makeelement(self, tag, attrib):创建一个新节点
##2)Element(tag, attrib={}):创建一个节点
##3)SubElement(parent, tag, attrib={}, **extra)用来构造一个已经存在的节点的子节点
#创建根节点
fa = et.Element("father")
#创建子节点
s1 = et.Element('son',{'name':"长子"})
s2 = fa.makeelement('son',{'name':'次子'})
s3 = et.SubElement(fa,'son',attrib={'name':"三子"})
#将子节点添加到父节点
fa.append(s1)
fa.append(s2)
#prettify(elem):将节点转换成字符串,并添加缩进
from xml.dom import minidom
def prettify(root):
rough = et.tostring(root,'utf-8')
reparse = minidom.parseString(rough)
return reparse.toprettyxml(indent=" ")
new_str = prettify(fa)
f = open("new_str.xml",'w',encoding='utf-8')
f.write(new_str)
f.close()
## 上述方法可以直接封装成一个方法
def mywrite(root,file):
rough = et.tostring(root, 'utf-8')
reparse = minidom.parseString(rough)
new_str = reparse.toprettyxml(indent=" ")
f = open(file, 'w', encoding='utf-8')
f.write(new_str)
f.close()
mywrite(fa,'writeXml.xml')
#生成文档对象,写入文档
##xml_declaration 给xml文件开头加上注解
# zp = et.ElementTree(fa)
# zp.write("zp.xml",encoding='utf-8',xml_declaration=True)