同福

Python使用xml.dom.minidom操作XML文档【20210630】

介绍

介绍

福哥今天要教给大家使用Python处理XML文档。XML文档格式是一种比JSON文档格式更加复杂的一种文本文档格式,XML文档包括节点和属性两个元素,节点名称可以重复,一个节点上的属性名称必须唯一,节点名称和属性名称没有统一性要求,相比较JSON格式XML格式可以存储更加复杂的关系的数据结构。

Python操作XML文档推荐使用minidom这个库,minidom库在xml.dom这个包里面。

安装

xml.dom.minidom不需要安装,默认就环境里就有了。

from xml.dom import minidom

使用

生成文档

首先我们来学习使用minidom来创建一个XML文档,使用minidom创建XML文档有点麻烦,每create一个对象都要自己去append这个对象,所有对象都要通过Document来创建,实在繁琐。

newDoc = minidom.Document()

rootNode = newDoc.createElement('root')
newDoc.appendChild(rootNode)

firstNode = newDoc.createElement('firstNode')
firstNode.setAttribute("rowid", "1")
firstNode.setAttribute("tableid", "100")
rootNode.appendChild(firstNode)

idNode = newDoc.createElement('id')
firstNode.appendChild(idNode)

idText = newDoc.createTextNode('35')
idNode.appendChild(idText)

nameNode = newDoc.createElement('name')
firstNode.appendChild(nameNode)

nameText = newDoc.createTextNode('福哥')
nameNode.appendChild(nameText)

with open(rootDir + "/test.xml", "w", encoding="utf-8") as fo:
    newDoc.writexml(fo, indent='', addindent='\t', newl='\n', encoding="utf-8")
    fo.close()

home/topic/2021/0701/16/4adc5bd22ec2866787b78076078f8a8b.png

解析文档

接着我们来解析这个XML文档。

可以使用childNodes进行逐级的遍历得到所有节点,但是XML文档的每个节点前后都会有一个#text节点,这个比较麻烦。

我们还可以使用getElementsByTagName来直接定位节点,福哥推荐这种方式来定位目标节点。注意即使只有一个子节点返回的也是一个数值,要记得取0位元素。

with open(rootDir + "/test.xml", "r", encoding="utf-8") as fo:
    myDoc = minidom.parse(fo)
    fo.close()

rootNode = myDoc.documentElement

# root child nodes
if rootNode.childNodes:
    for d in range(0, len(rootNode.childNodes)):
        myNode = rootNode.childNodes[d]
        print(myNode.nodeName, myNode.nodeType)

        if myNode.nodeName == "firstNode":
            # attributes
            if myNode.attributes:
                myAttrs = myNode.attributes.items()
                for e in range(0, len(myAttrs)):
                    myAttrName = myAttrs[e][0]
                    myAttrValue = myAttrs[e][1]
                    print(myNode.nodeName, "attribute: ", myAttrName, myAttrValue)

            # child nodes
            id = myNode.getElementsByTagName('id')
            print(myNode.nodeName, "child node: ", id[0].childNodes[0].data)

            name = myNode.getElementsByTagName('name')
            print(myNode.nodeName, "child node: ", name[0].childNodes[0].data)

home/topic/2021/0701/17/29ed73e97770d8191bce6d4dd434691c.png

总结

今天福哥带着童鞋们学习了使用Python去操作XML文档的技巧,福哥推荐使用minidom这个库,它足够简单,且足够应付我们日常的编程需要!