
XML 全称 Extensible MarkuP Language,中文译为可扩展标记语言。XML 之前有两个先行者:SGML 和 HTML,率先登场的是 SGML, 尽管它功能强大,但文档结构复杂,既不容易学也不易于使用,因此几个主要的浏览器厂商均拒绝支持 SGML,这些因素限制了 SGML 在网上的传播性;1989 年 HTML 登场,它继承了 SGML 诸多优点,去除了 SGML 复杂庞大的缺点,HTML 在数据显示上表现十分出色,但它的语法是不可扩展的,因此其无法描述数据、可读性差,没办法人们再次将目光转向 SGML,经过对 SGML 一系列改造,终于在 1998 年,XML 第一个版本问世。
上面说了那么多,简单来说就是:XML 和 HTML 均由 SGML 改造而来,HTML 是一种页面技术,聚焦的是数据的显示,而 XML 易于扩展,主要用来传送和存储数据,聚焦的是数据的内容。
2 解析2.1 解析方式Python 有三种 XML 解析方式:SAX(simple API for XML)、DOM(document Object Model)、ElementTree。
DOM 方式:DOM 中文译为文档对象模型,是 W3C 组织推荐的标准编程接口,它将 XML 数据在内存中解析成一个树,通过对树的 *** 作来 *** 作 XML。
SAX 方式:SAX 是一个用于处理 XML 事件驱动的模型,它逐行扫描文档,一边扫描一边解析,对于大型文档的解析拥有巨大优势,尽管不是 W3C 标准,但它却得到了广泛认可。
ElementTree 方式:ElementTree 相对于 DOM 来说拥有更好的性能,与 SAX 性能差不多,API 使用也很方便。
2.2 具体实现在具体解析之前我们先准备一个 XML,如下所示:
test.xml
<?xml version="1.0" enCoding="utf-8"?><List><student ID="stu1" name="stu"> <ID>1001</ID> <name>张三</name> <age>22</age> <gender>男</gender></student><student ID="stu2" name="stu"> <ID>1002</ID> <name>李四</name> <age>21</age> <gender>女</gender></student></List>DOM 方式解析
使用 DOM 方式,首先要对其 API 有一定了解,如果不了解,网上的教程也比较多,比如:DOM 教程,下面看一下使用示例。
from xml.dom.minIDom import parse# 读取文件dom = parse('test.xml')# 获取文档元素对象data = dom.documentElement# 获取 studentstus = data.getElementsByTagname('student')for stu in stus:# 获取标签属性值st_ID = stu.getAttribute('ID')st_name = stu.getAttribute('name')# 获取标签中内容ID = stu.getElementsByTagname('ID')[0].childNodes[0].nodeValuename = stu.getElementsByTagname('name')[0].childNodes[0].nodeValueage = stu.getElementsByTagname('age')[0].childNodes[0].nodeValuegender = stu.getElementsByTagname('gender')[0].childNodes[0].nodeValueprint('st_ID:', st_ID, ', st_name:',st_name)print('ID:', ID, ', name:', name, ', age:', age, ', gender:',gender)
输出结果:
st_ID: stu1 , st_name: stuID: 1001 , name: 张三 , age: 22 , gender: 男st_ID: stu2 , st_name: stuID: 1002 , name: 李四 , age: 21 , gender: 女
通过输出结果,我们可以发现已经获取了标签属性值和标签内容了。
SAX 方式解析使用 SAX 解析 XML 文档主要涉及到解析器和事件处理器,解析器负责读取 XML 文档,并向事件处理器发送事件,事件处理器负责对事件作出响应,对传递的 XML 数据进行处理。
Python 使用 SAX 处理 XML 需要用到 xml.sax 中的 parse 函数和 xml.sax.handler 中的 ContentHandler 类,下面看一下 ContentHandler 类中的一些方法。
characters(content):调用时机:从行开始,遇到标签之前,存在字符,content 的值为这些字符串;从一个标签,遇到下一个标签之前, 存在字符,content 的值为这些字符串;从一个标签,遇到行结束符之前,存在字符,content 的值为这些字符串。
startdocument():文档启动的时候调用。
enddocument():解析器到达文档结尾时调用。
startElement(name, attrs):遇到 XML 开始标签时调用,name 是标签的名字,attrs 是标签的属性值字典。
endElement(name):遇到 XML 结束标签时调用。
下面通过示例看一下如何通过 SAX 方式解析 XML。
import xml.saxclass StudentHandler(xml.sax.ContentHandler):def __init__(self):self.ID = ""self.name = ""self.age = ""self.gender = ""# 元素开始调用def startElement(self, tag, attributes):self.CurrentData = tagif tag == "student":stu_name = attributes["name"]print("stu_name:", stu_name)# 元素结束调用def endElement(self, tag):if self.CurrentData == "ID":print("ID:", self.ID)elif self.CurrentData == "name":print("name:", self.name)elif self.CurrentData == "age":print("age:", self.age)elif self.CurrentData == "gender":print("gender:", self.gender)self.CurrentData = ""# 读取字符时调用def characters(self, content):if self.CurrentData == "ID":self.ID = contentelif self.CurrentData == "name":self.name = contentelif self.CurrentData == "age":self.age = contentelif self.CurrentData == "gender":self.gender = contentif (__name__ == "__main__"):# 创建 XMLReaderparser = xml.sax.make_parser()# 关闭命名空间parser.setFeature(xml.sax.handler.feature_namespaces, 0)# 重写 ContextHandlerHandler = StudentHandler()parser.setContentHandler(Handler)parser.parse("test.xml")
输出结果:
stu_name: stuID: 1001name: 张三age: 22gender: 男stu_name: stuID: 1002name: 李四age: 21gender: 女ElementTree 方式解析
Python 提供了两种 ElementTree 的实现方式。一个是纯 Python 实现的 xml.etree.ElementTree,另一个是 C 语言实现 xml.etree.cElementTree,使用 C 语言实现的方式速度更快且内存消耗更少。python3.3 之后,ElemenTree 模块会自动优先使用 C 加速,如果不存在 C 实现,则会使用 Python 实现。因此,使用 python3.3+ 时,只需要 import xml.etree.ElementTree 即可。下面看一下示例。
import xml.etree.ElementTree as ETtree = ET.parse("test.xml")# 根节点root = tree.getroot()# 标签名print('root_tag:',root.tag)for stu in root:# 属性值print ("stu_name:", stu.attrib["name"])# 标签中内容print ("ID:", stu[0].text)print ("name:", stu[1].text)print("age:", stu[2].text)print("gender:", stu[3].text)
输出结果:
root_tag: Liststu_name: stuID: 1001name: 张三age: 22gender: 男stu_name: stuID: 1002name: 李四age: 21gender: 女总结
本文介绍和演示了 Python 三种 XML 解析方式,对 Python 工程师使用 Python 解析 XML 提供了支撑。
参考示例代码:https://github.com/JustDoPython/python-100-day
https://baike.baIDu.com/item/%E5%8F%AF%E6%89%A9%E5%B1%95%E6%A0%87%E8%AE%B0%E8%AF%AD%E8%A8%80/2885849?fromTitle=xml&fromID=86251&fr=aladdin
https://www.runoob.com/python3/python3-xml-processing.HTML
系列文章
第103天:Python *** 作 Excel
第102天:Python aiohttp第101天:Python asyncio从 0 学习 Python 0 - 100 大合集总结
以上是内存溢出为你收集整理的第104天: Python 解析 XML全部内容,希望文章能够帮你解决第104天: Python 解析 XML所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)