21天Python学习——Python操作XML文件

 

活动地址:CSDN21天学习挑战赛

一、Python解析XML文件

新建test.xml文件中包括


	
	   2022001
	   10
	   小白
	
	
	   2022002
	   20
	   小红
	
	
	   2022003
	   30
	   小黑
	

1.ElemetntTree方式

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,内容:小黑

2.DOM方式

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: 小黑

二、 Python写入XML文件 

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本
	

你可能感兴趣的:(python,python)