活动地址: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 >