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

 

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

一、Python解析XML文件

新建test.xml文件中包括

<collection shelf="New Arrivals">
	<class className="1班">
	   <code>2022001</code>
	   <number>10</number>
	   <teacher>小白</teacher>
	</class>
	<class className="2班">
	   <code>2022002</code>
	   <number>20</number>
	   <teacher>小红</teacher>
	</class>
	<class className="3班">
	   <code>2022003</code>
	   <number>30</number>
	   <teacher>小黑</teacher>
	</class>
</collection>

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) #输出:<Element 'collection' at 0x0000024810B95A40>
#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)) #输出:<class 'xml.etree.ElementTree.ElementTree'>
#获取根元素
root = tree.getroot()
print(type(root)) #输出:<class 'xml.etree.ElementTree.Element'>
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) #输出:[<DOM Element: class at 0x2045fe32ee0>, <DOM Element: class at 0x2045fe48c10>, <DOM Element: class at 0x2045fe48e50>]
print(type(class_list_obj)) #输出:<class 'xml.dom.minicompat.NodeList'>
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文件

<?xml version="1.0" encoding="utf-8"?>
<collection  type="New Arrivals">
	<book 语言="java">
		<!--这是一条注释-->
		<name>java基础</name>
		<价格>99元</价格>
		<number>剩余100本</number>
	</book>
	<book 语言="python">
		<name>python基础</name>
		<价格>50元</价格>
		<number>剩余20本</number>
	</book>
</collection >

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值