08 Python进阶:XML 解析

什么是 XML?

在这里插入图片描述

XML(可扩展标记语言,Extensible Markup Language)是一种用于表示和传输数据的标记语言。它被设计用来以一种结构化的形式描述文档的内容,并且具有良好的跨平台和跨语言的特性。XML使用标签来定义数据的结构,并可以通过自定义标签来适应各种不同的应用领域。

XML的主要特点包括:

  • 可扩展性:XML允许用户自定义标签,因此可以根据不同需求灵活扩展和定义数据结构。
  • 适应性:XML可以用于描述各种不同类型的数据,包括文本、图像、音频、视频等多媒体数据。
  • 平台无关性:XML是一种纯文本格式,不依赖于任何特定的硬件或软件平台。
  • 易于阅读和编写:XML文档使用标签进行结构化表示,使其易于人类阅读和编辑。
  • 广泛应用:XML在诸如Web服务(Web Services)、配置文件、数据交换等领域得到广泛应用。

通常,在XML中,数据以标签(tag)的形式包裹,并且可以使用属性(attributes)来提供更多的信息。下面是一个简单的XML示例:

<person><name>John Doe</name><age>30</age><gender>Male</gender>
</person>

这段XML描述了一个人员信息,包括姓名、年龄和性别。XML的灵活性和通用性使其成为数据交换、配置文件、Web服务等领域中常用的数据表示格式。

Python 对 XML 的解析方案

在这里插入图片描述

常见的 XML 编程接口有 DOM 和 SAX,这两种接口处理 XML 文件的方式不同,当然使用场合也不同。

Python 有三种方法解析 XML:ElementTree、SAX 以及 DOM。

  1. ElementTree
    xml.etree.ElementTree 是 Python 标准库中用于处理 XML 的模块,它提供了简单而高效的 API,用于解析和生成 XML 文档。

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

  3. DOM(Document Object Model)
    将 XML 数据在内存中解析成一个树,通过对树的操作来操作 XML。

后面用到的实例文件:

<collection shelf="New Arrivals">
<movie title="Enemy Behind"><type>War, Thriller</type><format>DVD</format><year>2003</year><rating>PG</rating><stars>10</stars><description>Talk about a US-Japan war</description>
</movie>
<movie title="Transformers"><type>Anime, Science Fiction</type><format>DVD</format><year>1989</year><rating>R</rating><stars>8</stars><description>A schientific fiction</description>
</movie><movie title="Trigun"><type>Anime, Action</type><format>DVD</format><episodes>4</episodes><rating>PG</rating><stars>10</stars><description>Vash the Stampede!</description>
</movie>
<movie title="Ishtar"><type>Comedy</type><format>VHS</format><rating>PG</rating><stars>2</stars><description>Viewable boredom</description>
</movie>
</collection>

Python 使用 ElementTree 解析 xml

xml.etree.ElementTree 是 Python 标准库中用于处理 XML 的模块。

以下是 xml.etree.ElementTree 模块的一些关键概念和用法:

ElementTree 和 Element 对象:

  • ElementTree: ElementTree 类是 XML 文档的树形表示。它包含一个或多个 Element 对象,代表整个 XML 文档。
  • Element: Element 对象是 XML 文档中元素的表示。每个元素都有一个标签、一组属性和零个或多个子元素。

接下来,让我们分步进行解释:

解析 XML

首先,需要导入 ElementTree 模块,并使用 ET.parse() 方法加载 XML 文件。

本例中文件名为 example.xml

使用 ET.parse() 方法加载 XML 文件,并使用 getroot() 方法获取 XML 树的根元素 root

import xml.etree.ElementTree as ETtree = ET.parse('example.xml')
root = tree.getroot()

遍历 XML 树

要遍历 XML 树,可以使用循环来遍历子元素。每个元素都有标签名 (tag)、属性 (attrib) 和文本内容 (text)。

for movie in root.findall('movie'):title = movie.get('title')print(f"Movie title: {title}")description = movie.find('description').textprint(f"Description: {description}")format = movie.find('format').textprint(f"Format: {format}")

在上面的示例中,使用 findall('movie') 方法遍历所有 movie 元素。然后,我们使用 get('title') 获取电影的标题属性,以及 find('description').text 获取描述子元素的文本内容,以及格式等。

访问元素属性和文本

  • 使用 get('attr_name') 方法来访问元素的属性。
  • 使用 find('subelement') 方法来获取子元素,然后使用 .text 属性来获取子元素的文本内容。

创建 XML 元素

要创建新的 XML 元素,可以使用 ET.SubElement() 方法,并将其附加到父元素中。

new_movie = ET.SubElement(root, 'movie')
new_movie.set('title', 'New Movie Title')new_description = ET.SubElement(new_movie, 'description')
new_description.text = 'Exciting new movie'

上面的例子中,我们创建了一个新的 movie 元素,并设置了它的标题属性和描述子元素的文本内容。

修改和删除 XML 元素

要修改现有元素的属性或文本内容,只需直接对相应的属性进行赋值操作即可。要删除元素,可以使用 remove() 方法。

# 修改元素属性
movie.set('title', 'New Title')# 修改子元素文本内容
description.text = 'New description'# 删除元素
root.remove(movie)

简单读取 XML 内容:

import xml.etree.ElementTree as ET# 定义一个 XML 字符串
xml_string = '''
<bookstore><book><title>Introduction to Python</title><author>John Doe</author><price>29.99</price></book><book><title>Data Science with Python</title><author>Jane Smith</author><price>39.95</price></book>
</bookstore>
'''# 使用 ElementTree 解析 XML 字符串
root = ET.fromstring(xml_string)# 遍历 XML 树
for book in root.findall('book'):title = book.find('title').textauthor = book.find('author').textprice = book.find('price').textprint(f'Title: {title}, Author: {author}, Price: {price}')

以上代码执行输出结果为:

Title: Introduction to Python, Author: John Doe, Price: 29.99
Title: Data Science with Python, Author: Jane Smith, Price: 39.95

Python 使用 SAX 解析 xml

SAX 是一种基于事件驱动的API。

利用 SAX 解析 XML 文档牵涉到两个部分: 解析器和事件处理器。

解析器负责读取 XML 文档,并向事件处理器发送事件,如元素开始跟元素结束事件。

而事件处理器则负责对事件作出响应,对传递的 XML 数据进行处理。

  1. 对大型文件进行处理;
  2. 只需要文件的部分内容,或者只需从文件中得到特定信息。
  3. 想建立自己的对象模型的时候。

在 Python 中使用 sax 方式处理 xml 要先引入 xml.sax 中的 parse 函数,还有 xml.sax.handler 中的 ContentHandler。
ContentHandler 类方法介绍

使用xml.dom解析xml

ContentHandler 类是 Python 的 xml.sax 模块中定义的一个标准接口,用于处理 XML 文档的内容。下面是常用的 ContentHandler 类方法、参数和简要介绍,以及配合示例:

方法介绍与参数:

  1. startDocument()

    • 参数:无
    • 介绍:开始解析文档时调用,用于初始化解析状态。
def startDocument(self):print("Start parsing document")
  1. endDocument()

    • 参数:无
    • 介绍:结束解析文档时调用,用于清理解析过程中占用的资源。
def endDocument(self):print("End parsing document")
  1. startElement(tag, attributes)

    • 参数:tag 表示元素标签名,attributes 是一个字典类型,包含了元素的属性。
    • 介绍:遇到 XML 元素的开始标签时调用,用于处理元素的开始部分。
def startElement(self, tag, attributes):print(f"Start element: {tag}")if attributes:print("Attributes:", attributes)
  1. endElement(tag)

    • 参数:tag 表示元素标签名。
    • 介绍:遇到 XML 元素的结束标签时调用,用于处理元素的结束部分。
def endElement(self, tag):print(f"End element: {tag}")
  1. characters(content)

    • 参数:content 是元素内的字符数据(文本内容)。
    • 介绍:用于处理元素内的字符数据。
def characters(self, content):print("Character data:", content)

make_parser, parserparseString 都是与 XML 解析相关的函数或类,通常用于解析和处理 XML 数据。下面是它们的简要介绍:

  1. xml.sax.make_parser()

    • xml.sax.make_parser() 函数用于创建并返回一个新的 SAX 解析器对象。
    • 示例:
      import xml.sax
      parser = xml.sax.make_parser()
      
  2. parser

    • parser 是由 xml.sax.make_parser() 创建的 SAX 解析器对象。它可以通过调用其他方法和设置内容处理器来实现 XML 数据的解析和处理。
    • 示例:
      parser.setFeature(xml.sax.handler.feature_namespaces, 0)
      
  3. parseString()

    • 在针对 XML 字符串进行解析时使用的方法。它是 xml.sax 模块中 xml.sax.parseString() 的同义词。
    • 示例:
      xml_string = "<note><to>Tove</to><from>Jani</from><heading>Reminder</heading><body>Don't forget me this weekend!</body></note>"
      parser = xml.sax.make_parser()
      handler = MyContentHandler()
      parser.setContentHandler(handler)
      parser.parseString(xml_string)
      

这些函数和方法都是 xml.sax 模块中用于解析 XML 的一部分。通过使用它们,可以有效地处理和操作 XML 数据。

示例代码:

import xml.saxclass MyContentHandler(xml.sax.ContentHandler):def startDocument(self):print("Start parsing document")def endDocument(self):print("End parsing document")def startElement(self, tag, attributes):print(f"Start element: {tag}")if attributes:print("Attributes:", attributes)def endElement(self, tag):print(f"End element: {tag}")def characters(self, content):print("Character data:", content)# 创建 XML 解析器对象
parser = xml.sax.make_parser()
# 关闭命名空间处理
parser.setFeature(xml.sax.handler.feature_namespaces, 0)# 设置内容处理器
content_handler = MyContentHandler()
parser.setContentHandler(content_handler)# 解析 XML 文件
xml_file = "example.xml"
with open(xml_file, "r") as file:parser.parse(file)

以上示例展示了如何创建一个自定义的 ContentHandlerMyContentHandler 并使用它来解析 XML 文件。在这个例子中,我们重写了 startDocument()endDocument()startElement()endElement()characters() 方法来处理不同类型的事件和内容。

使用xml.dom解析xml

文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。

一个 DOM 的解析器在解析一个 XML 文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后你可以利用DOM 提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入xml文件。

#!/usr/bin/python3from xml.dom.minidom import parse
import xml.dom.minidom# 使用minidom解析器打开 XML 文档
DOMTree = xml.dom.minidom.parse("movies.xml")
collection = DOMTree.documentElement
if collection.hasAttribute("shelf"):print ("Root element : %s" % collection.getAttribute("shelf"))# 在集合中获取所有电影
movies = collection.getElementsByTagName("movie")# 打印每部电影的详细信息
for movie in movies:print ("*****Movie*****")if movie.hasAttribute("title"):print ("Title: %s" % movie.getAttribute("title"))type = movie.getElementsByTagName('type')[0]print ("Type: %s" % type.childNodes[0].data)format = movie.getElementsByTagName('format')[0]print ("Format: %s" % format.childNodes[0].data)rating = movie.getElementsByTagName('rating')[0]print ("Rating: %s" % rating.childNodes[0].data)description = movie.getElementsByTagName('description')[0]print ("Description: %s" % description.childNodes[0].data)

结果:

Root element : New Arrivals
*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Rating: PG
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Rating: R
Description: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Description: Viewable boredom

关注我,不迷路,共学习,同进步

关注我,不迷路,共学习,同进步

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/596049.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于 elf loader 的编写

可以使用如下命令观看 elf 文件的信息 readelf -a build/ramdisk.img | vim -在编写 elf loader 的时候&#xff0c;实际上只有下图这一部分 “Program Headers” 是有用的 凡是类型为 “LOAD” 的就是需要加载进内存的部分 所以&#xff0c;只要把这些部分加载进内存里&…

【论文阅读】CompletionFormer:深度完成与卷积和视觉变压器

【论文阅读】CompletionFormer:深度完成与卷积和视觉变压器 文章目录 【论文阅读】CompletionFormer:深度完成与卷积和视觉变压器一、介绍二、联系工作深度完成Vision Transformer 三、方法四、实验结果 CompletionFormer: Depth Completion with Convolutions and Vision Tran…

S7-200 SMART 应用第003期-数字量输入模块接线

概述 S7-200 SMART作为西门子的一款高性价比PLC产品,很多工控电气工程师在选型和电路图设计时,对模块接线并不是非常清楚,为了使大家更好的了解和掌握该部分,本文从CPU本体、数字量输入(DI)、数字量输出(DQ)向大家详细介绍S7-200 SMART 详细的接线和注意事项。 不同型号C…

Linux学习之路 -- 进程篇 -- PCB介绍2 -- 标识符和进程创建

前面我们介绍了的进程的标识符&#xff0c;下面继续介绍进程标识符和进程创建的知识。 目录 一、进程创建 <1>fork函数的返回值 <2>创建子进程的目的 <3>代码共享 二、fork函数的相关问题 <1>为什么给父进程返回子进程的pid&#xff0c;给子进程…

OpenHarmony开发-系统烧录

本文详细介绍了烧录OpenHarmony系统到开发板的操作流程。从基础的硬件准备和软件环境设置入手&#xff0c;详细说明了如何配置开发环境、构建系统镜像等过程&#xff0c;详细描述了烧录过程中的关键步骤&#xff0c;以及如何使用专用工具将OpenHarmony系统镜像传输到开发板。同…

CSS层叠样式表学习(引入方式)

&#xff08;大家好&#xff0c;今天我们将继续来学习CSS引入方式的相关知识&#xff0c;大家可以在评论区进行互动答疑哦~加油&#xff01;&#x1f495;&#xff09; 五、CSS的三种样式表 5.1 CSS的三种样式表 按照CSS样式书写的位置(或者引入方式)&#xff0c;CSS样式表可…

11-pyspark的RDD的变换与动作算子总结

目录 前言 变换算子动作算子 前言 一般来说&#xff0c;RDD包括两个操作算子&#xff1a; 变换&#xff08;Transformations&#xff09;&#xff1a;变换算子的特点是懒执行&#xff0c;变换操作并不会立刻执行&#xff0c;而是需要等到有动作&#xff08;Actions&#xff09;…

蓝桥杯每日一题:公约数(gcd)

题目描述&#xff1a; 给定两个正整数 a 和 b。 你需要回答 q 个询问。 每个询问给定两个整数 l,r&#xff0c;你需要找到最大的整数 x&#xff0c;满足&#xff1a; x 是 a和 b 的公约数。l≤x≤r。 输入格式 第一行包含两个整数 a,b。 第二行包含一个整数 q。 接下来…

并发包中的CompletableFuture介绍及使用示例

一、抛砖引玉——优化一个计数任务 1.1、需求&#xff1a;计算从1加累加到100的结果 1.1.1、普通的实现代码示例 package com.example.mavendemo.completablefuture;public class NormalTest {public static void main(String[] args) {long startTime System.currentTimeM…

C#开发中一些常用的工具类分享

一、配置文件读写类 用于在开发时候C#操作配置文件读写信息 1、工具类 ReadIni 代码 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks;namesp…

LeetCode 1017. 负二进制转换

解题思路 相关代码 class Solution {public String baseNeg2(int n) {if(n0) return "0";String s"";while(n!0)if(Math.abs(n)%20){nn/(-2);ss0;}else{ss1; n (n-1)/(-2);}String t reverse(s);return t;}public String reverse(String s){Str…

ZYNQ学习Linux 基础外设的使用

基本都是摘抄正点原子的文章&#xff1a;《领航者 ZYNQ 之嵌入式Linux 开发指南 V3.2.pdf》&#xff0c;因初次学习&#xff0c;仅作学习摘录之用&#xff0c;有不懂之处后续会继续更新~ 工程的创建参考&#xff1a;《ZYNQ学习之Petalinux 设计流程实战》 一、GPIO 之 LED 的使…