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

前言:

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文件时需要用到的对象及函数、属性如下,完整的代码及程序运行结果如下所示:

序号 函数或属性 说明
1 ElementTree.parse 解析包含XML数据的文件名或文件对象,返回一个 ElementTree 实例
2 ElementTree.getroot 返回ElementTree 实例的根节点元素
3 Element.tag 返回元素类型,也即当前标签的名称
4 Element.attrib 返回元素的属性集合
5 Element.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)

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

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

序号 函数或属性 说明
1 ElementTree.write 将ElementTree实例以 XML 格式写入到文件,或是以写入模式打开的 file object
2 ElementTree.Element 创建元素对象
3 Element.set 设置元素的属性
4 Element.text 设置元素内容
5 Element.append 将指定元素设置为当前元素的子元素
6 ElementTree.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\")

一文详解测试Python读写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方便,后者不需要考虑这个。

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

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

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

序号 函数或属性 说明
1 xml.dom.minidom.Document() 创建新的文档对象
2 Document.createElement 新建元素节点
3 Document.appendChild 添加根节点
4 Element.setAttribute 新建节点属性,同时设置属性值
5 Element.appendChild 添加子节点
6 Document.createTextNode 创建文本节点
7 Document.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\")

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

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

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容