一文详解测试Python读写xml配置文件

发布时间:2022-9-28 09:18

xml也是常用的配置文件格式之一,Python中的xml.etree.ElementTree模块支持解析和创建xml数据。xml格式不再赘述,本文采用参考文献1中的示例xml数据作为测试数据,

内容如下:

<?xml version="1.0"?>
<data>
<country name="Liechtenstein">
<rank>1</rank>
<year>2008</year>
<gdppc>141100</gdppc>
<neighbor name="Austria" direction="E"/>
<neighbor name="Switzerland" direction="W"/>
</country>
<country name="Singapore">
<rank>4</rank>
<year>2011</year>
<gdppc>59900</gdppc>
<neighbor name="Malaysia" direction="N"/>
</country>
<country name="Panama">
<rank>68</rank>
<year>2011</year>
<gdppc>13600</gdppc>
<neighbor name="Costa Rica" direction="W"/>
<neighbor name="Colombia" direction="E"/>
</country>
</data>

读取xml文件时需要用到的对象及函数、属性如下,完整的代码及程序运行结果如下所示:

序号函数或属性说明
1ElementTree.parse解析包含XML数据的文件名或文件对象,返回一个 ElementTree 实例
2ElementTree.getroot返回ElementTree 实例的根节点元素
3Element.tag返回元素类型,也即当前标签的名称
4Element.attrib返回元素的属性集合
5Element.text返回元素内容
import xml.etree.ElementTree as ET

def ShowSubElement(curElement,level):
print(level,' tag:',curElement.tag,'attribute:', curElement.attrib,'text:',curElement.text)
for child in curElement:
ShowSubElement(child,level+1)
tree = ET.parse('test.xml')
level=1
root = tree.getroot()
ShowSubElement(root,level)

构建xml文件时需要用到的对象及函数、属性如下,完整的代码及程序运行结果如下所示:

序号函数或属性说明
1ElementTree.write将ElementTree实例以 XML 格式写入到文件,或是以写入模式打开的 file object
2ElementTree.Element创建元素对象
3Element.set设置元素的属性
4Element.text设置元素内容
5Element.append将指定元素设置为当前元素的子元素
6ElementTree.SubElement为给定元素创建新的子元素
import xml.etree.ElementTree as ET

root = ET.Element('root')
root.set('ver','2.0')

classA=ET.Element('classA')
root.append(classA)
classA.set("master","张三")
classA.set("grade","一年级")
studentA=ET.Element('studentA')
classA.append(studentA)
studentA.text='小米'

classB=ET.SubElement(root,'classB')
classB.set("master","李四")
classB.set("grade","三年级")
studentB=ET.SubElement(classB,'studentB')
studentB.text='小明'

tree = ET.ElementTree(root)
tree.write("writetest.xml")

除了上述基本的读写函数之外,xml.etree.ElementTree模块还提供有很多十分方便的查找函数,用于在 ElementTree 实例中快速查找指定的元素,详细介绍请见参考,

除了xml.etree.ElementTree模块,Python还支持采用xml.dom.minidom读写xml文件,后者是文档对象模型接口的最小化实现,其目标是比完整 DOM 更简单并且更为小巧,但如果对于DOM 还不十分熟悉,则应考虑改用 xml.etree.ElementTree 模块来进行 XML 处理。

读取xml文件时需要用到的对象及函数、属性如下,完整的代码及程序运行结果如下所示。从运行结果可以看出,xml.dom.minidom把元素的内容也作为一个节点,即#text,这点来说,没有xml.etree.ElementTree方便,后者不需要考虑这个。

序号函数或属性说明
1xml.dom.minidom.parse根据给定的输入返回Document对象,输入参数可以是文件名,也可以是文件类对象,如果xml内容保存在字符串中,可以使用parseString解析xml字符串
2Document.documentElement返回文档根元素
3Node.nodeName获取节点的节点名称,也即元素类型
4Node.nodeValue获取节点的值
5Node.attributes获取节点的属性集合
6Node.childNodes获取节点的子节点集合
7Node.hasAttributes获取节点是否有属性
8Node.hasChildNodes获取节点是否有子节点
9Attr.name节点属性的属性名称
10Attr.value节点属性的属性值
from xml.dom.minidom import parse

def ShowSubNode(curNode):
print('节点:',curNode.nodeName,":",curNode.nodeValue)

if curNode.nodeName=='#text':
return
if curNode.hasAttributes:
for attr in curNode.attributes.values():
print('属性:',attr.name,':',attr.value)

if curNode.hasChildNodes:
for child in curNode.childNodes:
ShowSubNode(child)

doc = parse('test.xml')
root = doc.documentElement
ShowSubNode(root)

构建xml文件时需要用到的对象及函数、属性如下,完整的代码及程序运行结果如下所示:

序号函数或属性说明
1xml.dom.minidom.Document()创建新的文档对象
2Document.createElement新建元素节点
3Document.appendChild添加根节点
4Element.setAttribute新建节点属性,同时设置属性值
5Element.appendChild添加子节点
6Document.createTextNode创建文本节点
7Document.writexml保存xml到文件
import xml.dom.minidom

doc = xml.dom.minidom.Document()

root=doc.createElement("root")
root.setAttribute('ver','2.0')
doc.appendChild(root) 

classA=doc.createElement('classA')
root.appendChild(classA)
classA.setAttribute("master","张三")
classA.setAttribute("grade","一年级")
studentA=doc.createElement('studentA')
classA.appendChild(studentA)
studentA.appendChild(doc.createTextNode('小米'))

classB=doc.createElement('classB')
root.appendChild(classB)
classB.setAttribute("master","李四")
classB.setAttribute("grade","三年级")
studentB=doc.createElement('studentB')
classB.appendChild(studentB)
studentB.appendChild(doc.createTextNode('小明'))

with open("writetest1.xml", "w", encoding='utf-8') as f:
doc.writexml(f, indent='\t', addindent='\t', newl='\n', encoding="utf-8")

上述内容即为采用xml.dom.minidom读写xml文件的基本用法。测试代码主要参考自参考[1],[2],其中唯一需要说明的是枚举节点的属性集合,百度了很多文章都没有看到怎么枚举的,后面直接到xml.dom.minidom的源码中翻到的用法参考

python实现将list拼接为一个字符串 生活杂谈

python实现将list拼接为一个字符串

在 python 中如果想将 list 拼接为一个字符串,可使用 join() 方法。 join() 方法描述 将序列(列表或元组)中的元素以指定的字符连接成一个新的字符串。 语法 s...
Python如何截取字符函数 生活杂谈

Python如何截取字符函数

在工作中我们经常会遇到某种情况需要截取字符串中某个特定标签之间的内容(爬虫可能用到的较多),适用于很多情况例如字符串形式的xml报文、json格式的字符串以及其它类型的字符串。 因为我总...
Python实现自动填写脚本流程详解 生活杂谈

Python实现自动填写脚本流程详解

这篇文章主要介绍了Python实现自动填写脚本,100%准确率,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下! 前言 环境使用 Python 3.8 Pycharm 模...