介绍
介绍
福哥今天要教给大家使用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()
解析文档
接着我们来解析这个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)
总结
今天福哥带着童鞋们学习了使用Python去操作XML文档的技巧,福哥推荐使用minidom这个库,它足够简单,且足够应付我们日常的编程需要!