08 Python进阶:XML 解析

news2024/10/7 15:26:03

什么是 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 ET

tree = 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').text
    print(f"Description: {description}")

    format = movie.find('format').text
    print(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').text
    author = book.find('author').text
    price = book.find('price').text
    print(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.sax

class 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/python3

from 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.coloradmin.cn/o/1573188.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PyTorch之计算模型推理时间

一、参考资料 如何测试模型的推理速度 Pytorch 测试模型的推理速度 二、计算PyTorch模型推理时间 1. 计算CPU推理时间 import torch import torchvision import time import tqdm from torchsummary import summarydef calcCPUTime():model torchvision.models.resnet18()…

深入浅出 -- 系统架构之分布式多形态的存储型集群

一、多形态的存储型集群 在上阶段&#xff0c;我们简单聊了下集群的基本知识&#xff0c;以及快速过了一下逻辑处理型集群的内容&#xff0c;下面重点来看看存储型集群&#xff0c;毕竟这块才是重头戏&#xff0c;集群的形态在其中有着多种多样的变化。 逻辑处理型的应用&…

线程池详解并使用Go语言实现 Pool

写在前面 在线程池中存在几个概念&#xff1a;核心线程数、最大线程数、任务队列。 核心线程数指的是线程池的基本大小&#xff1b;也就是指worker的数量最大线程数指的是&#xff0c;同一时刻线程池中线程的数量最大不能超过该值&#xff1b;实际上就是指task任务的数量。任务…

9_springboot_shiro_jwt_多端认证鉴权_整合jwt

1. Shiro框架回顾 到目前为之&#xff0c;Shiro框架本身的知识点已经介绍完了。web环境下&#xff0c;整个框架从使用的角度我们需要关注的几个点&#xff1a; 要使用Shiro框架&#xff0c;就要创建核心部件securityManager 对象。 SpringBoot项目中&#xff0c;引入shiro-spr…

python接入AI 实现微信自动回复

import numpy as np # 引入numpy库&#xff0c;目的是将读取的数据转换为列表 import pandas as pd # 引入pandas库&#xff0c;用来读取csv数据 from uiautomation import WindowControl # 引入uiautomation库中的WindowControl类&#xff0c;用来进行图像识别和模拟操作 i…

go | 上传文件分析 | http协议分析 | 使用openssl 实现 https 协议 server.key、server.pem

是这样的&#xff0c;现在分析抓包数据 test.go package mainimport ("fmt""log""github.com/gin-gonic/gin" )func main() {r : gin.Default()// Upload single filer.MaxMultipartMemory 8 << 20r.POST("/upload", func(c *g…

Apache Log4j2 Jndi RCE CVE-2021-44228漏洞原理讲解

Apache Log4j2 Jndi RCE CVE-2021-44228漏洞原理讲解 一、什么是Log4j2二、环境搭建三、简单使用Log4j2四、JDNI和RMI4.1、启动一个RMI服务端4.2、启动一个RMI客户端4.3、ldap 五、漏洞复现六、Python批量检测 参考视频&#xff1a;https://www.bilibili.com/video/BV1mZ4y1D7K…

基于Socket简单的TCP网络程序

⭐小白苦学IT的博客主页 ⭐初学者必看&#xff1a;Linux操作系统入门 ⭐代码仓库&#xff1a;Linux代码仓库 ❤关注我一起讨论和学习Linux系统 TCP单例模式的多线程版本的英汉互译服务器 我们先来认识一下与udp服务器实现的不同的接口&#xff1a; TCP服务器端 socket()&…

【C++初阶】String在OJ中的使用(一):仅仅反转字母、字符串中的第一个唯一字母、字符串最后一个单词的长度、验证回文串、字符串相加

前言&#xff1a; &#x1f3af;个人博客&#xff1a;Dream_Chaser &#x1f388;博客专栏&#xff1a;C &#x1f4da;本篇内容&#xff1a;仅仅反转字母、字符串中的第一个唯一字母、字符串最后一个单词的长度、验证回文串、字符串相加 目录 917.仅仅反转字母 题目描述&am…

【stm32】软件I2C读写MPU6050

软件I2C读写MPU6050(文章最后附上源码) 编码 概况 首先建立通信层的.c和.h模块 在通信层里写好I2C底层的GPIO初始化 以及6个时序基本单元 起始、终值、发送一个字节、接收一个字节、发送应答、接收应答 写好I2C通信层之后&#xff0c;再建立MPU6050的.c和.h模块 基于I2C通…

软考116-上午题-【计算机网络】-LINUX命令

一、真题 真题1&#xff1a; 真题2&#xff1a; 权限通常分为三类&#xff1a; 读&#xff08;r&#xff09;&#xff1a;允许读取文件内容或列出目录内容。写&#xff08;w&#xff09;&#xff1a;允许修改文件内容或在目录中创建/删除文件。执行&#xff08;x&#xff09;&…

stm32开发之threadx使用记录(主逻辑分析)

前言 threadx的相关参考资料 论坛资料、微软官网本次使用的开发板为普中科技–麒麟&#xff0c;核心芯片为 stm32f497zgt6开发工具选择的是stm32cubemx(代码生成工具)clion(代码编写工具)编译构建环境选择的是arm-none-gcc编译 本次项目结构 CMakeList对应的配置 set(CMAKE_…

SD-WAN国际网络专线:高效、合规且可靠的跨境连接解决方案

在数字化时代&#xff0c;企业对跨境网络连接的需求日益增长。SD-WAN技术作为一种新兴的解决方案&#xff0c;正逐渐成为构建跨境网络连接的首选。本文将探讨SD-WAN国际网络专线的发展现状、合规性要求以及选择时需要考虑的关键因素。 SD-WAN技术&#xff1a;跨境网络连接的新…

如何在没有备份的情况下从 iPad 恢复照片?

有很多操作都可能导致iPad照片丢失&#xff0c;包括误删除、出厂设置、iPad的iOS更新等。如果没有备份&#xff0c;似乎没有办法找回它们。然而&#xff0c;即使您将备份保留在 iCloud 或iTunes上&#xff0c;这些方式也需要您的 iPad 首先重置&#xff0c;从而用备份内容覆盖当…

堆排序解读

在算法世界中&#xff0c;排序算法一直是一个热门话题。推排序&#xff08;Heap Sort&#xff09;作为一种基于堆这种数据结构的有效排序方法&#xff0c;因其时间复杂度稳定且空间复杂度低而备受青睐。本文将深入探讨推排序的原理、实现方式&#xff0c;以及它在实际应用中的价…

lua学习笔记5(分支结构和循环的学习)

print("*****************分支结构和循环的学习******************") print("*****************if else语句******************") --if 条件 then end a660 b670 --单分支 if a<b thenprint(a) end --双分支 if a>b thenprint("满足条件")…

机器学习模型——逻辑回归

https://blog.csdn.net/qq_41682922/article/details/85013008 https://blog.csdn.net/guoziqing506/article/details/81328402 https://www.cnblogs.com/cymx66688/p/11363163.html 参数详解 逻辑回归的引出&#xff1a; 数据线性可分可以使用线性分类器&#xff0c;如果…

c# wpf LiveCharts 简单试验

1.概要 1.1 说明 1.2 环境准备 NuGet 添加插件安装 2.代码 <Window x:Class"WpfApp3.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"…

WindowsPowerShell安装配置Vim的折腾记录

说明 vim一直以来都被称为编辑器之神一样的存在。但用不用vim完全取决于你自己&#xff0c;但是作为一个学计算机的同学来说&#xff0c;免不了会和Linux打交道&#xff0c;而大部分的Linux操作系统都预装了vim作为编辑器&#xff0c;如果是简单的任务&#xff0c;其实vim只要会…

电商技术揭秘八:搜索引擎中的SEO内部链接建设与外部推广策略

文章目录 引言一、 内部链接结构优化1.1 清晰的导航链接1. 简洁明了的菜单项2. 逻辑性的布局3. 避免深层次的目录结构4. 使用文本链接5. 突出当前位置6. 移动设备兼容性 1.2 面包屑导航1. 显示当前页面位置2. 可点击的链接3. 简洁性4. 适当的分隔符5. 响应式设计6. 避免重复主页…