Python(13) python解析xml文件

最近因为工程原因,需要用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>
Element增加
Element删除
Element修改
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值