活动地址:CSDN21天学习挑战赛
新建test.xml文件中包括
2022001
10
小白
2022002
20
小红
2022003
30
小黑
ElementTree 模块提供了一个轻量级、Pythonic 的API,同时还有一个高效的C语言实现,即 xml.etree.cElementTree。与 DOM 相比,ET 的速度更快,API 使用更直接、方便。与 SAX 相比,ET.iterparse 函数同样提供了按需解析的功能,不会一次性在内存中读入整个文档。ET 的性能与 SAX 模块大致相仿,但是它的 API 更加高层次,用户使用器来更加便捷。
import xml.etree.ElementTree as ET
#1.加载test.xml文档,并进行解析
tree = ET.ElementTree(file='test.xml')
#2.获取根元素
root =tree.getroot()
print(root) #输出:
#3.根元素root是一个Element对象,打印其元素
print(root.tag) #输出:collection
print(root.attrib) #输出:{'shelf': 'New Arrivals'}
#4.遍历根元素的直接子元素
for child_of_root in root:
print(child_of_root.tag, child_of_root.attrib)
#输出:class {'className': '1班'}
# class {'className': '2班'}
# class {'className': '3班'}
#5.通过索引值访问特定的子元素
print(root[0].tag,root[0].attrib) #输出:class {'className': '1班'}
遍历 xml 文件中所有元素的完整解析代码如下:
import xml.etree.ElementTree as ET
#加载test.xml文档,并进行解析
tree = ET.ElementTree(file='test.xml')
print(type(tree)) #输出:
#获取根元素
root = tree.getroot()
print(type(root)) #输出:
print(root.tag) #输出:collection
#遍历剩余所有元素
for index,child in enumerate(root):
print("第%s个%s元素, 属性:%s"%(index, child.tag, child.attrib))
for i,child_child in enumerate(child):
print("标签:%s,内容:%s"%(child_child.tag,child_child.text))
# 输出:
# 第0个class元素, 属性:{'className': '1班'}
# 标签:code,内容:2022001
# 标签:number,内容:10
# 标签:teacher,内容:小白
# 第1个class元素, 属性:{'className': '2班'}
# 标签:code,内容:2022002
# 标签:number,内容:20
# 标签:teacher,内容:小红
# 第2个class元素, 属性:{'className': '3班'}
# 标签:code,内容:2022003
# 标签:number,内容:30
# 标签:teacher,内容:小黑
DOM(Document Object Model)将 XML 文档作为一棵树状结构进行分析,获取节点的内容以及相关属性,或是新增、删除和修改节点的内容。XML 解析器在加载 XML 文件后,DOM 模式将 XML 文件的元素视为一个树状结构的节点,一次性读入内存。
用法举例:
from xml.dom.minidom import parse
#读取文件
dom = parse('test.xml')
#获取文档元素对象
elem = dom.documentElement
#获取class
class_list_obj = elem.getElementsByTagName('class')
print(class_list_obj) #输出:[, , ]
print(type(class_list_obj)) #输出:
for class_element in class_list_obj:
#获取标签中内容
code = class_element.getElementsByTagName('code')[0].childNodes[0].nodeValue
number = class_element.getElementsByTagName('number')[0].childNodes[0].nodeValue
teacher = class_element.getElementsByTagName('teacher')[0].childNodes[0].nodeValue
print('code:',code,'number:',number,'teacher:',teacher)
# 输出:
# code: 2022001 number: 10 teacher: 小白
# code: 2022002 number: 20 teacher: 小红
# code: 2022003 number: 30 teacher: 小黑
doc.wirtexml() :生成xml文档,将创建的存在于内存中的xml文档写入本地硬盘中,这时才能看到新建的xml文档。
用法举例:
import xml.dom.minidom
# 1、在内存中创建一个空的文档
doc = xml.dom.minidom.Document()
# 2、创建根元素
root = doc.createElement('collection ')
# print('添加的xml标签为:',root.tagName)
# 3、设置根元素的属性
root.setAttribute('type', 'New Arrivals')
# 4、将根节点添加到文档对象中
doc.appendChild(root)
# 5、创建子元素
book = doc.createElement('book')
# 6、添加注释
book.appendChild(doc.createComment('这是一条注释'))
# 7、设置子元素的属性
book.setAttribute('语言', 'java')
# 8、子元素中嵌套子元素,并添加文本节点
name = doc.createElement('name')
name.appendChild(doc.createTextNode('java基础'))
price = doc.createElement('价格')
price.appendChild(doc.createTextNode('99元'))
number = doc.createElement('number')
number.appendChild(doc.createTextNode('剩余100本'))
# 9、将子元素添加到boot节点中
book.appendChild(name)
book.appendChild(price)
book.appendChild(number)
# 10、将book节点添加到root根元素中
root.appendChild(book)
# 创建子元素
book = doc.createElement('book')
# 设置子元素的属性
book.setAttribute('语言', 'python')
# 子元素中嵌套子元素,并添加文本节点
name = doc.createElement('name')
name.appendChild(doc.createTextNode('python基础'))
price = doc.createElement('价格')
price.appendChild(doc.createTextNode('50元'))
number = doc.createElement('number')
number.appendChild(doc.createTextNode('剩余20本'))
# 将子元素添加到boot节点中
book.appendChild(name)
book.appendChild(price)
book.appendChild(number)
# 将book节点添加到root根元素中
root.appendChild(book)
print(root.toxml())
fp = open('./书籍.xml', 'w', encoding='utf-8') # 需要指定utf-8的文件编码格式,不然notepad中显示十六进制
doc.writexml(fp, indent='', addindent='\t', newl='\n', encoding='utf-8')
fp.close()
创建出的XML文件
java基础
<价格>99元价格>
剩余100本
python基础
<价格>50元价格>
剩余20本