前言:
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)
构建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\")
除了上述基本的读写函数之外,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)
构建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\")
上述内容即为采用xml.dom.minidom读写xml文件的基本用法。测试代码主要参考自参考[1],[2],其中唯一需要说明的是枚举节点的属性集合,百度了很多文章都没有看到怎么枚举的,后面直接到xml.dom.minidom的源码中翻到的用法参考
暂无评论内容