12 Python使用xml

概述

在上一节,我们介绍了Python的正则表达式,包括:正则表达式的定义、正则表达式的语法、re.search函数、re.match函数、re.findall函数、re.sub函数、re.compile函数、re.finditer函数、re.split函数等内容。在这一节,我们将介绍如何在Python中使用xml。

XML英文全称为eXtensible Markup Language,中文为可扩展标记语言,是一种类似于HTML,但是没有使用预定义标记的语言。因此,XML可以根据自己的设计需求来定义专属的标记。最重要的是,因为XML的基本格式是标准化的,如果你在本地或互联网上跨系统或平台共享或传输XML,接收者仍然可以解析收到的数据。一句话总结就是:XML被设计用来传输和存储数据,不用于表现和展示数据,HTML则用来表现数据。

在Python中,通常使用如下几种方式来处理xml。

SAX:英文全称为Simple API for XML,逐行扫描XML文档,边扫描边解析,占用内存较小,速度较快。缺点是不能长期留驻在内存,数据不是长久的,事件过后,若没保存数据,数据便会丢失。

DOM:英文全称为Document Object Model,会将整个XML读入内存,在内存中解析成一个树,通过对树的操作来操作XML。该方式占用内存较大,解析速度较慢。

ElementTree:元素树,兼具了SAX方式和DOM方式的优点,占用内存较小,速度较快,使用较简单。

SAX

SAX是一种基于事件的解析XML的接口,它不会将整个文档加载到内存中,而是逐行或逐个元素地读取文档,然后触发相应的事件。在Python中,可以使用内置的xml.sax模块来实现SAX解析器。该模块提供了一组基本的事件处理器类,可以用于处理XML的不同部分,比如:元素、属性、文本等。由于SAX不会将整个文档加载到内存中,因此它更适合处理大型XML文档。

假如有如下的Friends.xml文件:

XML 复制代码
<?xml version='1.0' encoding='UTF-8'?>
<Friends>
  <Friend>
    <Name>Mike</Name>
    <Age>18</Age>
  </Friend>
  <Friend>
    <Name>Tom</Name>
    <Age>16</Age>
  </Friend>
</Friends>

我们可以使用下面的示例代码来读取这个Friends.xml文件。

python 复制代码
import os
import xml.sax

class FriendHandler(xml.sax.ContentHandler):
    def __init__(self):
        self.name = ''
        self.age = ''

    # 元素开始时调用
    def startElement(self, tag, attributes):
        self.CurrentData = tag

    # 元素结束时调用
    def endElement(self, tag):
        if self.CurrentData == 'Name':
            print('Name is', self.name)
        elif self.CurrentData == 'Age':
            print('Age is', self.age)
        self.CurrentData = ''

    # 读取字符时调用
    def characters(self, content):
        if self.CurrentData == 'Name':
            self.name = content
        elif self.CurrentData ==  'Age':
            self.age = content

parser = xml.sax.make_parser()
Handler = FriendHandler()
parser.setContentHandler(Handler)
path = os.getcwd() + 'Friends.xml'
parser.parse(path)

在上面的示例代码中,我们定义了一个名为FriendHandler的类,它继承了xml.sax.ContentHandler类,并实现了其中的三个方法,分别为:startElement、endElement和characters。当解析器遇到元素开始标签时,会调用startElement方法。当遇到元素结束标签时,会调用endElement方法。当遇到元素内的文本时,会调用characters方法。运行示例代码后,其输出如下:

python 复制代码
Name is Mike
Age is 18
Name is Tom
Age is 16

DOM

DOM是一种用于表示HTML和XML文档的接口标准,它提供了一种方式,使得开发者可以通过编程方式访问和修改文档的内容和结构。在Python中,可以使用多种库来实现DOM解析器,比如:xml.dom.minidom、lxml等。

在下面的示例代码中,我们使用xml.dom.minidom来解析上面提到的Friends.xml文件。另外,我们还可以使用minidom.parseString来解析xml字符串。

python 复制代码
import xml.dom.minidom as minidom

doc = minidom.parse('Friends.xml')
root = doc.documentElement 
children = root.childNodes
for child in children:
    if child.nodeName == 'Friend':
        name = child.getElementsByTagName('Name')[0]
        print('Name is', name.childNodes[0].data)
        age = child.getElementsByTagName('Age')[0]
        print('Age is', age.childNodes[0].data)

ElementTree

ElementTree提供了一个简单而高效的API用于解析和创建XML数据,它使用了一种基于树的模型来表示XML文档,使得我们可以很方便地访问和修改XML数据的元素和属性。

在下面的示例代码中,我们使用ElementTree来解析上面提到的Friends.xml文件。

python 复制代码
import xml.etree.ElementTree as ET

tree = ET.parse('Friends.xml')
root = tree.getroot()
for friend in root:
    name = friend[0]
    print('Name is', name.text)
    age = friend[1]
    print('Age is', age.text)

使用ElementTree,我们还可以很方便地生成xml,并保存到文件或字符串中。下面示例代码中生成的Friends_new.xml文件的内容,与上面提到的Friends.xml文件的内容相同。

python 复制代码
import xml.etree.ElementTree as ET
  
root = ET.Element('Friends')
  
child = ET.SubElement(root, 'Friend')
child_name = ET.SubElement(child, 'Name')
child_name.text = 'Mike'
child_age = ET.SubElement(child, 'Age')
child_age.text = '18'

child = ET.SubElement(root, 'Friend')
child_name = ET.SubElement(child, 'Name')
child_name.text = 'Tom'
child_age = ET.SubElement(child, 'Age')
child_age.text = '16'
   
tree = ET.ElementTree(root)
with open('Friends_new.xml', 'wb') as file:
    tree.write(file, 'UTF-8')
相关推荐
进击的六角龙27 分钟前
Python中处理Excel的基本概念(如工作簿、工作表等)
开发语言·python·excel
一只爱好编程的程序猿1 小时前
Java后台生成指定路径下创建指定名称的文件
java·python·数据下载
Aniay_ivy1 小时前
深入探索 Java 8 Stream 流:高效操作与应用场景
java·开发语言·python
gonghw4031 小时前
DearPyGui学习
python·gui
向阳12181 小时前
Bert快速入门
人工智能·python·自然语言处理·bert
engchina1 小时前
Neo4j 和 Python 初学者指南:如何使用可选关系匹配优化 Cypher 查询
数据库·python·neo4j
兆。1 小时前
掌握 PyQt5:从零开始的桌面应用开发
开发语言·爬虫·python·qt
南宫理的日知录2 小时前
99、Python并发编程:多线程的问题、临界资源以及同步机制
开发语言·python·学习·编程学习
coberup2 小时前
django Forbidden (403)错误解决方法
python·django·403错误
龙哥说跨境2 小时前
如何利用指纹浏览器爬虫绕过Cloudflare的防护?
服务器·网络·python·网络爬虫