【Python】基础知识(XML)

简介: XML 指可扩展标记语言(eXtensibleMarkupLanguage)。可扩展标记语言(英语:Extensible Markup Language,简称:XML)是一种标记语言,是从标准通用标记语言(SGML)中简化修改出来的。它主要用到的有可扩展标记语言、可扩展样式语言(XSL)、XBRL和XPath等。

1 XML概述


1.1 XML简介

image.png


定义

XML 指可扩展标记语言(eXtensibleMarkupLanguage)。可扩展标记语言(英语:Extensible Markup Language,简称:XML)是一种标记语言,是从标准通用标记语言(SGML)中简化修改出来的。它主要用到的有可扩展标记语言、可扩展样式语言(XSL)、XBRL和XPath等。


用途

传输和存储数据。


特点

与开发语言的操作系统无关,可跨平台实现操作系统间的通信。


具象描述

可扩展标记语言;很像HTML的标记语言;设计宗旨是传输数据,而不是显示数据;XML 标签没有被预定义;可以自定义标签对;被设计为具有自我描述性;W3C 的推荐标准。


1.2 XML语法

XML的一个小例子,可以参考上一节学习的内容。

<?xmlversion="1.0" encoding="utf-8"?><person><name>小明</name><sex></sex><age>18</age></person>


声明(可选择项)

从上面代码中可以看到,一个XML包含一个声明<?xml version="1.0" encoding="utf-8"?>


标签

必须有一个关闭标签。简单来说,XML必须有开始标签和结束标签,而且标签对的名称对大小写敏感。


属性值

属性值必须使用引号引起来。例如class="red"red就要使用引号括起来,如下:

<personclass="red"><name>张三</name></person>


特殊转义符

转义后

转义前

解释描述

&lt;

<

less than

&gt;

>

greater than

&amp;

&

ampersand

&apos;

'

apostrophe

&quot;

"

quotation mark


【注释】

<!-- 这是一个人对象 --><person><name>张三</name><age>18</age><person>


2 Python解析XML

> 从上面的学习中,我已经了解什么是XML,下面就开始使用Python来解析XML文件。Python 有三种方法解析 XML,他们是「SAX」「DOM」,以及 「ElementTree」。


2.1 解析XML方式&实验文件

1. SAX (simple API for XML )流式读取,需自定义回调函数

Python 标准库包含 SAX 解析器,SAX 用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。

2. DOM(Document Object Model)不建议使用,慢,占用内存

将 XML 数据在内存中解析成一个树,通过对树的操作来操作XML。

3. ElementTree(元素树)

ElementTree就像一个轻量级的DOM,具有方便友好的API。代码可用性好,速度快,消耗内存少。


比如,这里是一份xml文件persons.xml

<?xmlversion="1.0" encoding="utf-8"?><persons><personsid="001"><name>张小帅</name><sex></sex><age>18</age></person><personsid="002"><name>刘晓萌</name><sex></sex><age>21</age></person><personsid="003"><name>王老四</name><sex></sex><age>38</age></person></persons>


2.2 SAX解析xml

SAX是一种基于事件驱动的 API。利用SAX解析XML文档牵涉到两个部分: 「解析器」和「事件处理器」。


将下面的内容写在一个SaxPersons.py文件中,

#!/usr/bin/python# -*- coding: UTF-8 -*-importxml.saxclassPersonHandler( xml.sax.ContentHandler ):
def__init__(self):
self.CurrentData=""self.name=""self.sex=""self.age=""# 开始元素事件defstartElement(self, tag, attributes):
self.CurrentData=tagiftag=="person":
print ("*****person*****")
sid=attributes["sid"]
print ("编号:", sid)
# 结束元素事件defendElement(self, tag):
ifself.CurrentData=="name":
print ("姓名:", self.name)
elifself.CurrentData=="sex":
print ("性别:", self.sex)
elifself.CurrentData=="age":
print ("年龄:", self.age )     
self.CurrentData=""# 元素内容事件处理defcharacters(self, content):
ifself.CurrentData=="name":
self.name=contentelifself.CurrentData=="sex":
self.sex=contentelifself.CurrentData=="age":
self.age=contentif ( __name__=="__main__" ):
# 创建一个 XMLReader 对象parser=xml.sax.make_parser()
# 打开一个执行空间parser.setFeature(xml.sax.handler.feature_namespaces, 0)
# 重写 ContextHandler 指向我们自定义的执行器``PersonHandler``Handler=PersonHandler()
parser.setContentHandler( Handler )
# 解析转换指定路径上的XML文件parser.parse("persons.xml")py


在Python3环境下,执行命令python3 SaxPersons.py解析结果如下:

Aion,Liu$python3SaxPersons.py

执行后的结果如下:

*****person*****

编号: 001

姓名: 张小帅

性别: 男

年龄: 18

*****person*****

编号: 002

姓名: 刘晓萌

性别: 女

年龄: 21

*****person*****

编号: 003

姓名: 王老四

性别: 男

年龄: 38


🔑 Python官方提供了针对SAX2的解析支持:https://docs.python.org/3/library/xml.sax.html



2.3 DOM(xml.dom)解析xml

python中用xml.dom.minidom来解析xml文件。


下面,我们使用persons.xml作为实验对象,来解析xml。下面是我们的python文件DomPersons.py


「实验脚本」

#!/usr/bin/python# -*- coding: UTF-8 -*-fromxml.dom.minidomimportparseimportxml.dom.minidom# 使用minidom解析器打开 XML 文档DOMTree=xml.dom.minidom.parse("persons.xml")
collection=DOMTree.documentElementifcollection.hasAttribute("shelf"):
print ("根元素 : %s"%collection.getAttribute("shelf"))
# 在集合中获取所有同学persons=collection.getElementsByTagName("person")
# 遍历同学信息forpersoninpersons:
print ("*****person*****")
ifperson.hasAttribute("sid"):
print ("编号: %s"%person.getAttribute("sid"))
name=person.getElementsByTagName('name')[0]
print ("姓名: %s"%name.childNodes[0].data)
sex=person.getElementsByTagName('sex')[0]
print ("性别: %s"%sex.childNodes[0].data)
age=person.getElementsByTagName('age')[0]
print ("年龄: %s"%age.childNodes[0].data)


在Python3环境下,执行python3 DomPersons.py解析结果如下:


「执行脚本」

Aion.Liu$python3DomPersons.py


「输出内容」

*****person*****

编号: 001

姓名: 张小帅

性别: 男

年龄: 18

*****person*****

编号: 002

姓名: 刘晓萌

性别: 女

年龄: 21

*****person*****

编号: 003

姓名: 王老四

性别: 男

年龄: 38


🔑 Python官方提供解析支持:https://docs.python.org/3/library/xml.dom.html


2.4 ElementTree解析xml

警告:该xml.etree.ElementTree模块对恶意构建的数据不安全。如果您需要解析不受信任或未经身份验证的数据,请参阅[XML 漏洞],地址为https://docs.python.org/release/3.9.9/library/xml.html#xml-vulnerabilities


当然,我们还是使用上面的persons.xml文件来作为我们的实验对象。下面是我们的python文件ElePersons.py。


#!/usr/bin/python# -*- coding: UTF-8 -*-importxml.etree.ElementTreeasET# 导入文件到python对象,也可以一步到位,直接使用``persons = ET.fromstring(country_data_as_string) ``,这个代码同下面两行等价tree=ET.parse('persons.xml')
persons=tree.getroot()
# 迭代子节点 forindex, personinenumerate(persons):
print ("第%s个%s同学,编号:%s"% (index, person.tag, person.attrib))
# 子节点是嵌套的,使用索引来获取fori, pinenumerate(person):
print ("标签名称:%s,标签内容:%s"% (p.tag, p.text))


在Python3环境下,执行python3 ElePersons.py解析结果如下:


「执行脚本」

Aion.Liu$python3ElePersons.py

「输出内容」

第0个person同学,编号:{'sid': '001'}

标签名称:name,标签内容:张小帅

标签名称:sex,标签内容:男

标签名称:age,标签内容:18

第1个person同学,编号:{'sid': '002'}

标签名称:name,标签内容:刘晓萌

标签名称:sex,标签内容:女

标签名称:age,标签内容:21

第2个person同学,编号:{'sid': '003'}

标签名称:name,标签内容:王老四

标签名称:sex,标签内容:男

标签名称:age,标签内容:38



2.5 ElementTree 详细解析


🛎语法格式

xml.etree.ElementTree.Element(tag, attrib={}, **extra)


🩸 属性tag

一个字符串,用于标识此元素表示的数据类型(简单说就是元素类型)。例如在我们上面的解析过程中,我们使用persons获取对象后,获取他的标签对是persons


>>>importxml.etree.ElementTreeasET>>>persons=ET.parse('persons.xml').getroot()
>>>print (persons.tag)
persons


在嵌套的对象中,我们使用迭代元素之后,可以循环遍历这个对象的标签,如下所示,其中使用了Python中的内置函数enumerate,该函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中:


「执行脚本」

>>>forindex, personinenumerate(persons):
...     print (person.tag)
...
personpersonperson


🔑 关于Python内置函数,可以参考官方提供文档:https://docs.python.org/release/3.10.4/library/functions.html


「🩸 属性attrib

元素属性的字典。下面获取每个同学的属性,学籍编号,如下面所示:

>>>forindex, personinenumerate(persons):
...     print (person.attrib)
...
{'sid': '001'}
{'sid': '002'}
{'sid': '003'}


「🩸 属性text

标签对的内容。从下面的代码中,可以看到。text是针对标签对的内容或值。

>>>forindex, personinenumerate(persons):
...     forpi, pinenumerate(person):
...         print (p.tag)
...         print (p.text)
...         print ("------------")
...


「输出内容」

name

张小帅

------------

sex

------------

age

18

------------

name

刘晓萌

------------

sex

------------

age

21

------------

name

王老四

------------

sex

------------

age

38

------------


🤔 思考

如果我想要打印出来persons这个对象的text内容,将会是什么呢,有兴趣的可以尝试下?


🔑 Python官方提供解析支持:https://docs.python.org/release/3.9.9/library/xml.etree.elementtree.html#module-xml.etree.ElementTree


相关文章
|
22天前
|
消息中间件 分布式计算 监控
Python面试:消息队列(RabbitMQ、Kafka)基础知识与应用
【4月更文挑战第18天】本文探讨了Python面试中RabbitMQ与Kafka的常见问题和易错点,包括两者的基础概念、特性对比、Python客户端使用、消息队列应用场景及消息可靠性保证。重点讲解了消息丢失与重复的避免策略,并提供了实战代码示例,帮助读者提升在分布式系统中使用消息队列的能力。
34 2
|
1月前
|
机器学习/深度学习 数据采集 数据可视化
Python数据分析入门:基础知识与必备工具
【4月更文挑战第12天】Python是大数据时代数据分析的热门语言,以其简单易学和丰富库资源备受青睐。本文介绍了Python数据分析基础,包括Python语言特点、数据分析概念及其优势。重点讲解了NumPy、Pandas、Matplotlib、Seaborn和Scikit-learn等必备工具,它们分别用于数值计算、数据处理、可视化和机器学习。此外,还概述了数据分析基本流程,从数据获取到结果展示。掌握这些知识和工具,有助于初学者快速入门Python数据分析。
|
3天前
|
XML 前端开发 数据格式
BeautifulSoup 是一个 Python 库,用于从 HTML 和 XML 文件中提取数据
BeautifulSoup 是 Python 的一个库,用于解析 HTML 和 XML 文件,即使在格式不规范的情况下也能有效工作。通过创建 BeautifulSoup 对象并使用方法如 find_all 和 get,可以方便地提取和查找文档中的信息。以下是一段示例代码,展示如何安装库、解析 HTML 数据以及打印段落、链接和特定类名的元素。BeautifulSoup 还支持更复杂的查询和文档修改功能。
11 1
|
19天前
|
运维 分布式计算 Java
第一章 Python基础知识
第一章 Python基础知识
|
20天前
|
XML 数据格式 Python
【代码片段】【Python】XML 字符串格式化打印
【代码片段】【Python】XML 字符串格式化打印
18 0
|
25天前
|
存储 文件存储 Python
python基础知识(一)
python基础(一){编码,字符串格式化,数据类型,运算符,推导式(简化生成数据),函数编程,模块}
|
27天前
|
Python
python 格式化、set类型和class类基础知识练习(下)
python 格式化、set类型和class类基础知识练习(下)
24 0
|
27天前
|
索引 Python
python 格式化、set类型和class类基础知识练习(上)
python 格式化、set类型和class类基础知识练习
66 0
|
28天前
|
Python
python学习1-基础知识(数据类型等)
python学习1-基础知识(数据类型等)
|
29天前
|
Java 程序员 Python
Python基础知识主要包括其**语法规则、数据类型、控制结构以及函数和模块**等
【4月更文挑战第15天】Python基础知识主要包括其**语法规则、数据类型、控制结构以及函数和模块**等
27 11