1. 什么是XML
可扩展标记语言XML是一种极其简单的数据存储语言,其结构化特性使其成为各种应用程序之间进行数据传输时最常用的工具。XML没有预定义的标签,使用者可以根据自己的需要自定义XML标签存储并传输其所想传输存储的任何数据。
- 存储,可用来存放配置文件,例如:java的配置文件。
- 传输,网络传输时以这种格式存在,例如:早期ajax传输的数据、soap协议等。
<?xml version="1.0" encoding="UTF-8" ?>
<!-- COTP request -->
<COTP>
<Length>17</Length>
<PDU_Type>0x0e</PDU_Type>
<Destination_reference>0x0000</Destination_reference>
<Source_reference>0x007</Source_reference>
<Class>0</Class>
<Extended_formats>False</Extended_formats>
<No_explicit_flow_control>False</No_explicit_flow_control>
<Parameter_code>0xc1</Parameter_code>
<Parameter_length>2</Parameter_length>
<Source_TSAP>0100</Source_TSAP>
<Parameter_code>0xc2</Parameter_code>
<Parameter_length>2</Parameter_length>
<Destination_TSAP>0102</Destination_TSAP>
<Parameter_code>0xc0</Parameter_code>
<Parameter_length>1</Parameter_length>
<TPDU_size>1024</TPDU_size>
</COTP>
2. XML相关操作
① 读取XML文件并转换为字符串
该部分仅通过迭代的方式实现了对1级和2级的XML文件中的数据进行读取并转换为字符串的操作,其他更为复杂的格式目前未曾实现转换。
import xml.etree.ElementTree as ET
def parse_xml_1(path):
# ET打开xml文件
tree = ET.parse(path)
# 获取根标签
root = tree.getroot()
# print(root)
message = ""
# 获取root标签的孩子标签
message = message + root.tag + '\r\n'
i = 0
for child in root:
if i == 0:
if child.text is not None:
message += child.text
else:
pass
else:
if child.text is not None:
message += ";" + child.text
else:
message += ";"
i = i + 1
return message
def parse_xml_2(path):
# ET打开xml文件
tree = ET.parse(path)
# 获取根标签
root = tree.getroot()
# print(root)
message = ""
# 获取root标签的孩子标签
message = message + root.tag + '\r\n'
for child in root:
message = message + child.tag + '\r\n'
# print(child.tag, child.attrib, child.text)
i = 0
for node in child:
# print(node.tag, node.attrib, node.text)
if i == 0:
if node.text is not None:
message += node.text
else:
pass
else:
if node.text is not None:
message += ";" + node.text
else:
message += ";"
i = i + 1
message = message + '\r\n'
return message
将前文中的XML文件转换后的结果如下:
此外,还可以通过 find() 和 findall() 函数对指定的节点数据进行读取,该部分更详细操作见:Python基础——文件操作之XML格式文件
# ET打开xml文件
tree = ET.parse(path)
# 获取根标签
root = tree.getroot()
# print(root)
PDU_Type_object = root.find("PDU_Type")
print(PDU_Type_object.tag, PDU_Type_object.attrib)
② 修改和删除节点
import xml.etree.ElementTree as ET
# ET去打开xml文件
tree = ET.parse(path)
# 获取根标签 data
root = tree.getroot()
# 修改节点内容和属性
Length = root.find('Length')
print(Length.text)
Length.text = "999"
Length.set('update', '2020-11-11')
print(Length.text, Length.attrib)
# 保存文件
tree = ET.ElementTree(root)
tree.write("new.xml", encoding='utf-8')
# 删除节点
root.remove(root.find('Length') )
print(root.findall('Length'))
# 保存文件
tree = ET.ElementTree(root)
tree.write("newnew.xml", encoding='utf-8')
③ 构建XML文件
第一种:
from xml.etree import ElementTree as ET
# 创建根标签
root = ET.Element("home")
# 创建节点大儿子
son1 = ET.Element('son', {
'name': '儿1'})
# 创建小儿子
son2 = ET.Element('son', {
"name": '儿2'})
# 在大儿子中创建两个孙子
grandson1 = ET.Element('grandson', {
'name': '儿11'})
grandson2 = ET.Element('grandson', {
'name': '儿12'})
son1.append(grandson1)
son1.append(grandson2)
# 把儿子添加到根节点中
root.append(son1)
root.append(son2)
tree = ET.ElementTree(root)
tree.write('oooo.xml', encoding='utf-8', short_empty_elements=False)
生成的XML如下:
<home>
<son name="儿1">
<grandson name="儿11"></grandson>
<grandson name="儿12"></grandson>
</son>
<son name="儿2"></son>
</home>
第二种:
from xml.etree import ElementTree as ET
# 创建根节点
root = ET.Element("famliy")
# 创建大儿子
son1 = root.makeelement('son', {
'name': '儿1'})
# 创建小儿子
son2 = root.makeelement('son', {
"name": '儿2'})
# 在大儿子中创建两个孙子
grandson1 = son1.makeelement('grandson', {
'name': '儿11'})
grandson2 = son1.makeelement('grandson', {
'name': '儿12'})
son1.append(grandson1)
son1.append(grandson2)
# 把儿子添加到根节点中
root.append(son1)
root.append(son2)
tree = ET.ElementTree(root)
tree.write('oooo.xml',encoding='utf-8')
生成的XML如下:
<famliy>
<son name="儿1">
<grandson name="儿11"></grandson>
<grandson name="儿12"></grandson>
</son>
<son name="儿2"></son>
</famliy>
第三种:
from xml.etree import ElementTree as ET
# 创建根节点
root = ET.Element("famliy")
# 创建节点大儿子
son1 = ET.SubElement(root, "son", attrib={
'name': '儿1'})
# 创建小儿子
son2 = ET.SubElement(root, "son", attrib={
"name": "儿2"})
# 在大儿子中创建一个孙子
grandson1 = ET.SubElement(son1, "age", attrib={
'name': '儿11'})
grandson1.text = '孙子'
et = ET.ElementTree(root) #生成文档对象
et.write("test.xml", encoding="utf-8")
生成的XML如下:
<famliy>
<son name="儿1">
<age name="儿11">孙子</age>
</son>
<son name="儿2"></son>
</famliy>