15. XML解析

news2024/9/28 9:33:22

1. 什么是 XML?

XML 指可扩展标记语言(EXtensible Markup Language)。
a. XML 是一种很像HTML的标记语言。
b. XML 的设计宗旨是传输数据,而不是显示数据
c. XML 标签没有被预定义。您需要自行定义标签。
d. XML 被设计为具有自我描述性。
e. XML 是 W3C 的推荐标准。

2. XML 和 HTML 之间的差异

XML 不是 HTML 的替代
a. XML 和 HTML 为不同的目的而设计:
b. XML 被设计用来传输和存储数据,其焦点是数据的内容。
c. HTML 被设计用来显示数据,其焦点是数据的外观。
d. HTML 旨在显示信息,而 XML 旨在传输信息。

3. 通过 XML 可以自定义标签

<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

上面实例中的标签没有在任何 XML 标准中定义过(比如 <to><from>)。这些标签是由 XML 文档的创作者发明的
这是因为 XML 语言没有预定义的标签。HTML 中使用的标签都是预定义的。HTML 文档只能使用在 HTML 标准中定义过的标签(如 <p><h1> 等等)。XML 允许创作者定义自己的标签和自己的文档结构

4. python中对XML的解析

XML比JSON复杂,在Web中应用也不如以前多了,不过仍有很多地方在用,所以,有必要了解如何操作XML。
python有三种方法解析XML,SAXDOM,以及 ElementTree
本篇中使用到的XML实例文件如下:movies.xml

# movies.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>

5. 使用 SAX方式 解析 xml

SAX 是一种基于事件驱动的API。
利用 SAX 解析 XML 文档牵涉到两个部分: 解析器事件处理器
解析器负责读取 XML 文档,并向事件处理器发送事件,如元素开始跟元素结束事件。
事件处理器负责对事件作出响应,对传递的 XML 数据进行处理
 (1) 对大型文件进行处理;
 (2) 只需要文件的部分内容,或者只需从文件中得到特定信息;
 (3) 想建立自己的对象模型的时候。
在 python 中使用 SAX 方式处理 xml 要先引入 xml.sax 中的 parse 函数,还有 xml.sax.handler 中的 ContentHandler

import xml.sax

class MovieHandler(xml.sax.ContentHandler):
    def __init__(self):
        self.CurrentData = ""
        self.type = ""
        self.format = ""
        self.year = ""
        self.rating = ""
        self.stars = ""
        self.description = ""

    # 元素开始调用 => 遇到XML开始标签时调用, tag是标签的名字, attributes是标签的属性字典值
    def startElement(self, tag, attributes):
        self.CurrentData = tag
        if tag == "movie":
            print('')
            print("Title:", attributes["title"])

    # 元素结束调用 => 遇到XML结束标签时调用
    def endElement(self, tag):
        if self.CurrentData == "type":
            print("Type:", self.type)
        elif self.CurrentData == "format":
            print("Format:", self.format)
        elif self.CurrentData == "year":
            print("Year:", self.year)
        elif self.CurrentData == "rating":
            print("Rating:", self.rating)
        elif self.CurrentData == "stars":
            print("Stars:", self.stars)
        elif self.CurrentData == "description":
            print("Description:", self.description)
        self.CurrentData = ""

    # 读取字符时调用
    def characters(self, content):
        if self.CurrentData == "type":
            self.type = content
        elif self.CurrentData == "format":
            self.format = content
        elif self.CurrentData == "year":
            self.year = content
        elif self.CurrentData == "rating":
            self.rating = content
        elif self.CurrentData == "stars":
            self.stars = content
        elif self.CurrentData == "description":
            self.description = content


if __name__ == "__main__":
    # 创建一个 XMLReader
    parser = xml.sax.make_parser()
    # 关闭命名空间
    parser.setFeature(xml.sax.handler.feature_namespaces, 0)
    # 重写 ContextHandler
    parser.setContentHandler(MovieHandler())
    # 解析xml文档
    parser.parse("movies.xml")

在这里插入图片描述

6. 使用 DOM方式 解析 xml

文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。
一个 DOM 的解析器在解析一个XML文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后你可以利用DOM 提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入xml文件。
DOM会把整个XML读入内存,解析为树,因此占用内存大,解析慢,优点是可以任意遍历树的节点。
在 python 中使用 DOM 方式处理 xml 则要通过 xml.dom.minidom 来解析 xml 文件。

import xml.dom.minidom

if __name__ == "__main__":
    # 使用minidom解析器打开XML文档
    DOMTree = xml.dom.minidom.parse("movies.xml")
    collection = DOMTree.documentElement

    if collection.hasAttribute("shelf"):
        print("Root element : %s" % collection.getAttribute("shelf"))

    # 在集合中获取所有电影(整个movie节点项)
    movies = collection.getElementsByTagName("movie")

    # 打印每部电影的详细信息
    for movie in movies:
        print('')
        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)

在这里插入图片描述

7. 使用 ElementTree方式 解析xml

xml.etree.ElementTree(简称ET)模块提供了一个轻量级、Pythonic的API,同时还有一个高效的C语言实现,即xml.etree.cElementTree。与DOM相比,ET的速度更快,API使用更直接、方便与SAX相比,ET.iterparse函数同样提供了按需解析的功能,不会一次性在内存中读入整个文档ET的性能与SAX模块大致相仿,但是它的API更加高层次,用户使用起来更加便捷

Element类型是一种灵活的容器对象,用于在内存中存储结构化数据。
[注意] xml.etree.ElementTree模块在应对恶意结构数据时显得并不安全。
每个element对象都具有以下属性:
  1. tag:string对象,表示数据代表的种类。
  2. attrib:dictionary对象,表示附有的属性。
  3. text:string对象,表示element的内容。
  4. tail:string对象,表示element闭合之后的尾迹。
<tag attrib1=1>text</tag>tail
  1     2        3         4
import xml.etree.ElementTree as ET

tree = ET.parse('movies.xml')
root = tree.getroot()
# print(root.tag, ',', root.attrib)  # 打印根元素标签及属性

# child就是movie结点
# children是moive结点的项item
for Node in root.findall("movie"):
    print('')
    for item in Node:
        print(item.tag, ':', item.text)

在这里插入图片描述

8. 写在最后

更多详细API及demo请参考官网网站:
https://docs.python.org/3.9/library/markup.html#structured-markup-processing-tools

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

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

相关文章

Tomcat详解

Tomcat 是一个 HTTP 服务器. 前面我们已经学习了 HTTP 协议, 知道了 HTTP 协议就是 HTTP 客户端和 HTTP 服务器之间的交互数据的格式. 同时也通过 ajax 和 Java Socket 分别构造了 HTTP 客户端. HTTP 服务器我们也同样可以通过 Java Socket 来实现. 而 Tomcat 就是基于 Java 实…

星戈瑞--磺化CY7标记活性脂Sulfo CY7-NHS注意事项你知道那些?

Sulfo-Cy7 NHS酯是一种磺化、亲水性和高度水溶性染料。该试剂允许制备Cy7标记的生物分子&#xff0c;特别适用于标记脆弱的蛋白质和易变性的蛋白质。染料标记的分子可用于各种研究相关的实验。近红外荧光成像利用了生物组织在特定波长范围内的透明度。在活生物体中&#xff0c;…

2. Kimball的DW/BI架构解析

文章目录Kimball的DW/BI架构1. 业务系统&#xff08;数据源系统&#xff09;2. 获取-转换-加载&#xff08;ETL&#xff09;系统3. 用于支持BI&#xff08;商业智能&#xff09;决策的展现区4. 商业智能应用引言&#xff1a;DW&#xff0c;即Data Warehouse&#xff0c;数据仓库…

LLA: Loss-aware Label Assignment for Dense Pedestrian Detection 原理与代码解析

paper&#xff1a;LLA: Loss-aware Label Assignment for Dense Pedestrian Detectioncode&#xff1a;https://github.com/Megvii-BaseDetection/LLA背景标签分配由于对检测器的性能影响很大&#xff0c;在通用目标检测中得到了广泛的研究&#xff0c;但是密集行人检测中的标签…

【SpringCloud复习巩固】Gateway

目录 一.统一网关Gateway 1.1为什么需要网关 1.2网关的技术实现 1.3网关的作用 1.4搭建网关服务 1.5路由断言工厂Route Predicate Factory 1.6路由过滤器GatewayFilter 1.7全局过滤器GlobalFilter 1.8过滤器执行顺序 1.9跨域问题解决 一.统一网关Gateway 1.1为什么需…

《流浪地球2》里的硬核科技,IT人带入了

《流浪地球2》不负期待&#xff0c;上映后口碑和热度一路高歌猛进&#xff0c;霸坐春节档&#xff0c;稳居票房TOP2。硬核科技惊喜不断&#xff0c;如喷出冲天蓝光的行星发动机、洞悉一切的量子计算机、高耸入云的太空电梯…… 逼真的特效质感以及浓厚的重工业美学掀起科技新热…

UE4中修改模型的中心点

UE4系列文章目录 文章目录UE4系列文章目录前言一、增加scenen空组件前言 在UE4中的模型中心点一般都在模型的中点&#xff0c;如果是门这样的模型&#xff0c;我们就不能绕中心点旋转了&#xff0c;不然会觉得很奇怪。但是默认的静态网格体中心点都在物体中心&#xff0c;那我…

易观千帆 | 2022年12月银行APP月活跃用户规模盘点

易观千帆&#xff1a;12月手机银行服务应用活跃人数51688.69万&#xff0c;环比下降1.81%。结合历史数据&#xff0c;2022年9月达到全年高峰的54191.75万&#xff0c;总体来看保持波动增长。12月农商行手机银行服务应用活跃人数1580.59万&#xff0c;环比下降3.01%。农商行手机…

scrapy的概念作用和工作流程

scrapy的概念和流程 学习目标&#xff1a; 了解 scrapy的概念了解 scrapy框架的作用掌握 scrapy框架的运行流程掌握 scrapy中每个模块的作用 1. scrapy的概念 Scrapy是一个Python编写的开源网络爬虫框架。它是一个被设计用于爬取网络数据、提取结构性数据的框架。 Scrapy 使…

K8s简介之什么是K8s

1.概述 欢迎来到K8s入门课程。Kubernetes&#xff0c;也被称为K8s或Kube&#xff0c;是谷歌推出的业界最受欢迎的容器编排器。本K8s教程由一系列关于K8s的文章组成。在第一部分&#xff0c;我们将讨论什么是K8s和K8s的基本概念。 本课程是专为初学者开设的&#xff0c;你可以…

Java个人遇到问题汇总

问题汇总1. 虚拟机1.1 CentOS71) 连不上网络问题解决1.2 Docker1) 私服配置无法重启docker问题解决后续2. SSMP2.1 Spring1) 测试类一直空指针问题解决2.2 MyBatis MyBatis-Plus1) IDEA加入方言后SQL语句依然不提示解决2) MP更新数据,更新了其他列问题解决3.SpringBoot3.1 Thym…

nginx学习笔记8(小滴课堂)

nginx第三方利器---OpenRestyLua介绍 OpenRestyLua的相关环境准备 我们先来去安装我们的OpenResty: 我们按照官网的要求去配置就可以了&#xff1a; 按照官网的步骤一步一步去走就可以了。 然后我们开始去安装我们的OpenResty: 这里有非常多的安装包吧&#xff0c;我们到时候需…

硬件---计算机概论

电脑硬件的五大单元 输入单元&#xff1a;包括键盘、鼠标、卡片阅读机、扫描仪、手写板、触控屏幕等等一堆&#xff1b;主机部分(控制单元、算数逻辑单元与主存储器)&#xff1a;这个就是系统单元&#xff0c;被主机机壳保护住了&#xff0c;里面含有一堆板子、CPU 与主存储器…

为什么u盘不显示数据?u盘不显示数据恢复的3种方法

虽然u盘在数据备份、重装系统或其他领域中都能发挥很大的作用&#xff0c;但是在使用过程中难免会遇到一些问题&#xff0c;比如u盘数据不显示&#xff01;那么&#xff0c;遇到u盘不显示数据怎么解决呢&#xff1f;阅读本文&#xff0c;您将知晓u盘不显示数据的常见原因和相应…

Deep Learning Tuning Playbook(中译版)

前言 由五名研究人员和工程师组成的团队发布了《Deep Learning Tuning Playbook》&#xff0c;来自他们自己训练神经网络的实验结果以及工程师的一些实践建议&#xff0c;目前在Github上已有1.5k星。原项目地址本文为《Deep Learning Tuning Playbook》中文翻译版本&#xff0…

Vuex状态管理器

目录 1、什么是vuex 2、vuex的使用场景&#xff1a; 3、vuex的工作方式&#xff1a; 4、vuex的核心API ​ &#xff08;1&#xff09;state&#xff1a; &#xff08;2&#xff09;mutations &#xff08;3&#xff09;actions&#xff1a;通过actions去触发mutations中…

2023.1.30 作业

一、TF-A的初步移植1、对tf-a源码进行解压tar -xvf tf-a-stm32mp-2.2.r2-r0.tar.gz2、进入tf-a源码顶层目录cd tf-a-stm32mp-2.2.r23、对tf-a源码进行打补丁操作for p in ls -1 ../*.patch; do patch -p1 < $p; done4、配置交叉编译工具链&#xff0c;打开../Makefile.sdk&a…

2023牛客寒假算法基础集训营4(7/13)

清楚姐姐学信息论数学&#xff0c;只需要求x的y次方和y的x次方那个大选哪个&#xff0c;除了2和3时是3多&#xff0c;其他情况都是数越小能代表的数越多AC代码&#xff1a;#include <bits/stdc.h> using namespace std; using LL long long; int main() {ios::sync_with…

ESP32 Arduino学习篇 (三) 蓝牙

简介&#xff1a;1.1蓝牙分类经典蓝牙我们一般说的是BT&#xff0c;低功耗蓝牙我们一般说成BLE。当设备支持蓝牙4.0时&#xff0c;还得进一步确认设备是支持BT单模、BLE单模还是BT和BLE都支持的双模。低功耗蓝牙 (BLE)&#xff1a; 支持蓝牙协议4.0或更高的模块。主打低功耗&am…

手上有了这些工具,明天争取6点下班!

一个优秀的开发者&#xff0c;一定是会利用各种工具来提升自己的开发效率。这段时间&#xff0c;我开始分享优质提升开发效率的工具&#xff0c;集成效率工具&#xff0c;开源集成网站等等&#xff0c;朋友们一直在催更&#xff0c;我知道你很急&#xff0c;但是你先别急&#…