最近因为工程原因,需要用python来解析xml文件,python自带了解析xml的module。这个Module的document网址是:https://docs.python.org/2/library/xml.etree.elementtree.html
原本想要自己写一下的,但是阅读了官方文档之后,发现直接翻译原文一些我认为有用的部分,可能更好理解。
New in version 2.5.
Source code: Lib/xml/etree/ElementTree.py
XML是一种固有的分层数据格式,所以最自然的表示方式就是用树来表示它。针对这个目的,设计了
xml.etree.ElementTree as ET
里面的两个类来实现。一个类是ElementTree
,把整个XML文档表现为一棵树,另一个类是Element
,表示这棵树上面的一个节点。
Element
Element类型是一个灵活的包装器对象,它被设计用来在内存里包装分层的数据结构,这个类型既像列表,又像字典。
Element
的类内变量:
tag
:一个string,它定义了Element
的类型。attributes
:一系列属性,存放在python的字典里。text
: 一个string,Element
的文本。an optional tail string
:一个可操作的尾部字符串,暂时不知道用来干嘛的。child elements
:一系列子element,存放在python的sequence里面
如何创建一个Element
实例:
使用Element
构造器或者是SubElement()
方法
import xml.etree.ElementTree as ET
a = ET.Element('UESTC', tag='gzh', attrib={"name": 'GZHermit',"age":'16'})#这里的16不能用int,必须得用string
ET.dump(a)
######
<UESTC age="16" name="GZHermit" tag="gzh" />
ElementTree
ElementTree
表现的是整个xml的树结构,可以用于初始化一棵树出来用来生成一个新的xml文件,也可以以树的形式来加载一个已有的xml文件。
parse(source, parser=None):加载一个xml文件,以ElementTree的格式包裹它的内容,
source
是一个文件名或者一个文件对象。getroot():返回根节点
如何创建一个ElementTree
实例:
index.xml:
<html>
<head>
<title>Example page</title>
</head>
<body>
<p>Moved to <a href="http://example.org/">example.org</a>
or <a href="http://example.com/">example.com</a>.</p>
</body>
</html>
example.py
>>> from xml.etree.ElementTree import ElementTree
>>> tree = ElementTree()
>>> tree.parse("index.xml")
<Element 'html' at 0xb77e6fac>
#上面两行代码直接等价于tree=ET.parse("index.xml")
>>> p = tree.find("body/p") # Finds first occurrence of tag p in body
>>> p
<Element 'p' at 0xb77ec26c>
>>> links = list(p.iter("a")) # Returns list of all links
>>> links
[<Element 'a' at 0xb77ec2ac>, <Element 'a' at 0xb77ec1cc>]
>>> for i in links: # Iterates through all found links
... i.attrib["target"] = "blank"
...
>>> tree.write("output.xml")
接下来介绍一下基本的xml文件的读取,保存,以及文件内部节点的增删查改等基本功能。
example.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文件
import xml.etree.ElementTree as ET
def read_xml(file):
tree = ET.parse(file)
return tree
tree = read_xml('example.xml')
写入xml文件
import xml.etree.ElementTree as ET
def write_xml(file,tree):
tree.write(file)
write_xml('example.xml',tree)
遍历xml内Element
def iter_xml(root):
for node in list(root):
print(node)
iter_xml(tree.getroot())
######
<Element 'country' at 0x7f182629acc8>
<Element 'country' at 0x7f18262bb688>
<Element 'country' at 0x7f18262bb818>
list(Element)会把当前节点的所有相邻子节点以list形式返回回来。list里面仍然是由Element组成,所以可以通过这样的方式迭代查询下去。
如果想要一次性的
也可以根据Element的名字直接进行遍历,那么将从当前节点出发遍历该节点下面所有的子节点。
def iter_xml(root,name):
for node in root.iter(name):
print(node)
iter_xml(tree.getroot(), 'neighbor')
######
<Element 'neighbor' at 0x7f8f7e626638>
<Element 'neighbor' at 0x7f8f7e626688>
<Element 'neighbor' at 0x7f8f7e626818>
<Element 'neighbor' at 0x7f8f7e6269a8>
<Element 'neighbor' at 0x7f8f7e6269f8>