Python第三⽅模块之ElementTree(ET)-解析XML⽂件ElementTree是Python常⽤的处理XML⽂件的类。下⾯将介绍使⽤ElementTree解析、查、修改XML的⽅法。
1、引⽤⽅法
ElementTree as ET
2、⼀个XML例⼦
下⾯所有的操作都将下⾯这段XML为例,我们将它保存为l。
<?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的格式做⼀些说明:
Tag: 标签,如country标签
Element:被Tag包围的部分,值,如 68,2011 等
Attribute:标签的属性,如country标签的name
python处理xml文件3、解析XML
3.1 读取
读⼊XML数据有三种途径,从⽂件读⼊和从字符串读⼊,⽂件读⼊有2种
1、python3.3之后ElementTree模块会⾃动寻可⽤的C库来加快速度
ElementTree as ET
tree = ET.parse('l')
root = t()
2、调⽤ElementTree类ElementTree(self, element=None, file=None) # 这⾥的element作为根节点
ElementTree as ET
tree = ET.ElementTree(file="l")
root = t() # <Element 'data' at 0x030EA600>
3、从字符串读⼊:
ElementTree as ET
data = open("l").read()
root = ET.fromstring(data)
# root = ET.fromstring(sample_as_string)
3.2 查看Tag和Attribute
# 当要获取属性值时,⽤attrib⽅法。返回⼀个字典,如
print(root.attrib)
# 可以(AttributeName)来代替Element.attrib[AttributeName]来访问。
# 当要获取节点值时,⽤text⽅法。返回⼀个字符串,如
)
# 当要获取节点名时,⽤tag⽅法。返回⼀个字符串,如
print(root.tag)
3.3 查看孩⼦
.root.attrib返回的是⼀个空字典,如果看root的孩⼦,可以得到⾮空的attrib字典。
1、使⽤in...查询根节点下⼆级节点的所有元素
print(root.tag)# 根节点标签
for child in root:
print(child.tag,child.attrib) # ⼆级节点标签、属性、内容,结果得到
# country {'name': 'Liechtenstein'}
# country {'name': 'Singapore'}
# country {'name': 'Panama'}
2、使⽤findall等查询根节点下的元素
Element.iter()⽤来寻所有符合要求的Tag,注意,这⾥查的范围是所有孩⼦和孩⼦的孩⼦ and so
Element.findall()只查直接的孩⼦,返回所有符合要求的Tag的Element
Element.find()只返回符合要求的第⼀个Element。如果查看Singapore的year的值
for child in root.findall('.//country'):
print(child.tag,child.attrib)
4、修改XML
前⾯已经介绍了如何获取⼀个Element的对象,以及查看它的Tag、Attribute、值和它的孩⼦。下⾯介绍如何修改⼀个Element并对XML⽂件进⾏保存
修改Element。修改Element可以直接访问。
ElementTree as ET
# 修改Element的Attribute,也可以⽤来新增Attribute:
ET.Element.set('AttributeName','AttributeValue')
# 新增孩⼦节点:
root.append(childElement)
# 删除孩⼦节点:
保存XML。我们从⽂件解析的时候,我们⽤了⼀个ElementTree的对象tree,在完成修改之后,还⽤tree来保存XML⽂件。tree.write('l')
构建XML。ElementTree提供了两个静态函数(直接⽤类名访问,这⾥我们⽤的是ET)可以很⽅便的构建⼀个XML,如:ElementTree as ET
root = ET.Element('data')
country = ET.SubElement(root,'country', {'name':'Liechtenstein'}) # root 增加 country 节点
rank = ET.SubElement(country,'rank') # country 增加 rank 节点
< = '1'
year = ET.SubElement(country,'year') # country 增加 year节点
< = '2008'
ET.dump(root)
5、XPath⽀持
XPath表达式⽤来在XML中定位Element,下⾯给⼀个例⼦来说明:
ElementTree as ET
root = ET.fromstring(countrydata)
# Top-level elements
root.findall(".")
# All 'neighbor' grand-children of 'country' children of the top-level
# elements
root.findall("./country/neighbor")
# Nodes with name='Singapore' that have a 'year' child
root.findall(".//year/..[@name='Singapore']")
# 'year' nodes that are children of nodes with name='Singapore'
root.findall(".//*[@name='Singapore']/year")
# All 'neighbor' nodes that are the second child of their parent
root.findall(".//neighbor[2]")
6、namespace
6.1 namespace 获取
# namespace 为正则匹配获取,可能不同版本的会获取不到
root = t()
namespace = re.search('\{.*?\}', root.tag)[0]
6.Element 在处理含有namespace的xml⽂件时写⼊会产⽣ns0
root = t()
namespace = re.search('\{.*?\}', root.tag)[0]
7、其他错误
7.1 Error parsing XML: junk after document element
⼀般合法的XML⽂件只有⼀个主根节点,⽐如
<android123>
<item1/>
<item2/>
<item3/>
</android123>
如果出现了Error parsing XML: junk after document element这样的错误,你的想法可能只要主根有多个节点,⽐如说
<android123>
<item1/>
</android123>
<android123>
<item2/>
<item3/>
</android123>
xml不能解析,原因有可能为xml格式写的不对,考虑根节点不对。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论