干货 | Python 标准库之 XML(上)

640

本文作者:Rocky0249

公众号:Python空间


写在之前


带分隔符的文件仅有两维的数据:行 & 列。如果我们想在程序之间交换数据结构,需要一种方法把层次结构,序列,集合和其它的数据结构编码成文本。


今天要说的 XML 是最突出的处理上述这种转换的标记格式,它使用标签(tag)分隔数据。XML 在软件领域的用途非常广泛。


XML


XML 是什么?如果非要对其做一个定义式的说明,那这里我不得不引用一下 w3school 里面简洁而明快的说明:


  • XML 指可扩展标记语言(EXtensible Markup Language);

  • XML 是一种标记语言,类似于 HTML;

  • XML 的设计宗旨是传输数据,而非显示数据;

  • XML 标签没有被预定义,需要自行定义标签;

  • XML 被设计为具有自我描述性;

  • XML 是 W3C 的推荐标准。


如果你想要详细了解和学习 XML 的话,可以去阅读 w3school 的 XML 教程即可,里面讲述的很详细,在下面我还会引用一些里面的内容。


XML 的重要性在于它是用来传输数据的,因此,特别是在 Web 编程中我们经常会用到它。有了它,让数据传输变的更加简单,这么重要的东西,我大 Python 当然支持。


有大佬曾经说过:“一个引人关注的东西总会有很多人从不同侧面去研究它”。这个在编程中也同样适用,所以对于 XML 这个红得发紫的东西,Python 提供了多种模块来处理。


  • xml.dom.* 模块:Document Object Model。适合用于处理 DOM API。它能够将 XML 数据在内存中解析成一个树,然后通过对树的操作来操作 XML。但是这种方式由于将 XML 数据映射到内存中的树,导致比较慢,且消耗更多内存。

  • xml.sax.* 模块:simple API for XML。由于 SAX 以流式读取 XML 文件,从而速度较快,占用内存少,但是在操作上稍微复杂,需要用户实现回调函数。


当然还有一些别的,比如 xml.parse.expat,xml.etree.ElementTree 等等,我就不在列举了,碰到的时候再去查查,否则光看这些东西头就大了,而且无聊的很。


遍历查询


先要做一个 XML 文档,我自己想也想不出个啥太好的来,所以直接用 w3school 中的一个例子,如下图所示:


640


上图表示下面的 XML 中的一本书:


<bookstore>
<book category="COOKING">
 <title lang="en">Everyday Italian</title>
 <author>Giada De Laurentiis</author>
 <year>2005</year>
 <price>30.00</price>
</book>
<book category="CHILDREN">
 <title lang="en">Harry Potter</title>
 <author>J K. Rowling</author>
 <year>2005</year>
 <price>29.99</price>
</book>
<book category="WEB">
 <title lang="en">Learning XML</title>
 <author>Erik T. Ray</author>
 <year>2003</year>
 <price>39.95</price>
</book>
</bookstore>


将上述的 XML 保存并且命名为 test.xml 文件,接下来就是以它为对象,练习各种操作了。


>>> import xml.etree.ElementTree as ET
>>> tree = ET.ElementTree(file = 'test.xml')
>>> tree
<xml.etree.ElementTree.ElementTree object at 0x00000000025B8630>


上面建立起 XML 解析树对象,然后通过根节点向下开始读取各个元素(element 对象)。


在上述 XML 文档中,根元素是 bookstore,它没有属性,也可以说是属性为空。


>>> root = tree.getroot()
>>> root.tag
'bookstore'
>>> root.attrib
{}


要想将根下面的元素都读取出来,可以进行如下操作:


>>> for child in root:
...    print(child.tag,child.attrib)
...
('book', {'category': 'COOKING'})
('book', {'category': 'CHILDREN'})
('book', {'category': 'WEB'})


也可以像下面这样读取指定元素的信息:


>>> root[0].tag
'book'
>>> root[0].attrib
{'category': 'COOKING'}
>>> root[0].text
'
 '


上述的 root[0].text 无内容,再深入一层,我们就可以看到内容了:


>>> root[0][0].tag
'title'
>>> root[0][0].attrib
{'lang': 'en'}
>>> root[0][0].text
'Everyday Italian'


对于 ElementTree 对象,有一个 iter() 方法可以对指定名称的子节点进行深度优先遍历,例如下面这样:


>>> for ele in tree.iter(tag='book'):
...    print(ele.tag,ele.attrib)
...
('book', {'category': 'COOKING'})
('book', {'category': 'CHILDREN'})
('book', {'category': 'WEB'})


上述代码是遍历名称为 book 的节点,如果不指定节点的话,就是将所有的元素遍历一遍:


>>> for ele in tree.iter():
...    print(ele.tag,ele.attrib)
...
('bookstore', {})
('book', {'category': 'COOKING'})
('title', {'lang': 'en'})
('author', {})
('year', {})
('price', {})
('book', {'category': 'CHILDREN'})
('title', {'lang': 'en'})
('author', {})
('year', {})
('price', {})
('book', {'category': 'WEB'})
('title', {'lang': 'en'})
('author', {})
('year', {})
('price', {})


除了上面的方法外,还可以通过路径搜索到指定的元素,然后读取其内容,这就是 xpath,关于 xpath 是什么,在这不多做介绍,感兴趣的可以去 Google。


写在之后


今天的文章如果你能坚持看到这,恭喜你又学到了。前半部分概念的东西有点多,而且看着还头晕,这个其实是没办法的事情,不说概念脑子里形不成概念,后面的理解就很麻烦。还好后面就是操作了,还是那句话,多敲代码,别光看,敲几遍记住它。


如果你觉得本篇文章对你有帮助的话,别忘了点个赞and?,谢谢。


推荐阅读:

一文彻底搞懂 Python 生成器!

一文彻底搞懂 Python 装饰器


640?wx_fmt=jpeg

?扫描添加微信获取 10 本 Python 经典书籍

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值