38.Python从入门到精通—Python3 XML 解析 什么是 XML Python 对 XML 的解析

38.从入门到精通:Python3 XML 解析 什么是 XML Python 对 XML 的解析 Python 使用 SAX 解析 xml make_parser 方法 parser 方法

Python3 XML 解析

什么是 XML

  • XML(可扩展标记语言)是一种用于描述数据的标记语言,它可以用于表示各种类型的数据,包括文本、图像、音频、视频等。XML 的语法类似于HTML,但它更加灵活,可以自定义标记,并且不依赖于任何特定的应用程序或操作系统。
  • XML的基本结构由元素、属性和文本组成。元素是标记的基本单位,它由开始标记、结束标记和元素内容组成。属性是用于描述元素的附加信息,它由属性名和属性值组成。文本是元素的内容,可以包含任何类型的数据。

XML 可以用于数据交换、配置文件、Web 服务等领域。它具有以下优点:

  • 可扩展性:XML 可以自定义标记,因此可以适应各种数据类型和应用程序的需求。
  • 可读性:XML 的语法类似于 HTML,易于阅读和理解。
  • 独立性:XML 不依赖于任何特定的应用程序或操作系统,因此可以在不同的平台和环境中使用。
  • 互操作性:XML 可以与各种编程语言和技术进行集成,例如 Java、.NET、Web 服务等。

XML 的缺点是它相对于其他数据格式来说,文件体积较大,因为它需要使用开始标记和结束标记来描述数据。此外,XML
的解析和处理也需要更多的计算资源和时间。

Python 对 XML 的解析

Python 提供了多种解析 XML 的方法,其中比较常用的有以下几种:

  • DOM 解析:将整个 XML 文档读入内存,并构建 DOM 树,可以对树进行遍历和操作,适合于 XML 文件较小的情况。
  • SAX 解析:基于事件驱动的解析方式,逐行解析 XML 文档,适合于 XML 文件较大的情况。
  • ElementTree 解析:Python 标准库中的一个解析库,提供了高效的解析和操作 XML 的方法,同时也支持 XPath 查询。

以下是一个使用 ElementTree 解析 XML 的简单示例:

import xml.etree.ElementTree as ET

# 解析 XML 文件
tree = ET.parse('example.xml')

# 获取根节点
root = tree.getroot()

# 遍历子节点
for child in root:
    print(child.tag, child.attrib)

# 获取指定节点
person = root.find('person')
name = person.find('name').text
age = person.find('age').text
print(name, age)

# 使用 XPath 查询
persons = root.findall('.//person')
for person in persons:
    name = person.find('name').text
    age = person.find('age').text
    print(name, age)

在这个示例中,我们使用 ET.parse 方法解析 XML 文件,并获取根节点。然后我们使用 for 循环遍历根节点的所有子节点,并输出节点的标签和属性。接着我们使用 find 方法获取指定节点的文本内容。最后,我们使用 findall
方法和 XPath 查询获取所有符合条件的节点,并输出节点的文本内容。

需要注意的是,在解析 XML 文件时,可能会遇到编码和命名空间等问题,需要根据具体情况进行处理。

Python 使用 SAX 解析 xml

Python 中有两种主要的解析 XML 的方式:SAX 和 DOM。SAX(Simple API for XML)是基于事件驱动的解析方式,它逐行扫描 XML 文档,并在遇到特定的 XML 元素时触发事件。相比之下,DOM(Document Object Model)是一种基于树形结构的解析方式,它将整个 XML 文档加载到内存中,并将其表示为一个树形结构。
下面是一个使用 SAX 解析 XML 的示例:

import xml.sax

class MyHandler(xml.sax.ContentHandler):
    def startElement(self, name, attrs):
        print("Start element:", name)
        if attrs:
            print("Attributes:")
            for attr in attrs.items():
                print("  ", attr[0], "=", attr[1])
<span class="hljs-keyword">def</span> <span class="hljs-title function_">endElement</span>(<span class="hljs-keyword">self</span>, name):
    <span class="hljs-built_in">print</span>(<span class="hljs-string">"End element:"</span>, name)

<span class="hljs-keyword">def</span> <span class="hljs-title function_">characters</span>(<span class="hljs-keyword">self</span>, content):
    <span class="hljs-built_in">print</span>(<span class="hljs-string">"Content:"</span>, content)

parser = xml.sax.make_parser()
parser.setContentHandler(MyHandler())
parser.parse('example.xml')

在这个例子中,我们定义了一个名为 MyHandler 的类,它继承自 xml.sax.ContentHandler 类,并重写了startElement、endElement 和 characters 方法。这些方法将在 SAX 解析 XML 文档时自动调用。

然后,我们创建一个 XML 解析器对象,并将 MyHandler 对象设置为其内容处理器。最后,我们调用 parse 方法来开始解析 XML 文档。
注意,在这个例子中,我们假设 XML 文档的结构如下:

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
  <book id="bk101">
    <author>Gambardella, Matthew</author>
    <title>XML Developer's Guide</title>
    <genre>Computer</genre>
    <price>44.95</price>
    <publish_date>2000-10-01</publish_date>
    <description>An in-depth look at creating applications 
      with XML.</description>
  </book>
  <book id="bk102">
    <author>Ralls, Kim</author>
    <title>Midnight Rain</title>
    <genre>Fantasy</genre>
    <price>5.95</price>
    <publish_date>2000-12-16</publish_date>
    <description>A former architect battles corporate zombies, 
      an evil sorceress, and her own childhood to become queen 
      of the world.</description>
  </book>
</catalog>

在解析过程中,当 SAX 解析器遇到开始标记时,它将调用 startElement 方法,并将元素名称和属性作为参数传递给它。当 SAX
解析器遇到结束标记时,它将调用 endElement 方法,并将元素名称作为参数传递给它。当 SAX 解析器遇到文本时,它将调用
characters 方法,并将文本内容作为参数传递给它。

make_parser 方法

make_parser 方法是 Python 标准库中 xml.sax 模块中的一个函数,用于创建 SAX 解析器对象。它的语法如下:

xml.sax.make_parser([parser_list])

其中,parser_list 是可选参数,指定要使用的 SAX 解析器列表。 如果没有指定解析器列表,则 make_parser方法会创建一个默认的 SAX 解析器对象。如果指定了解析器列表,则会按照列表中的顺序逐个尝试创建解析器对象,直到成功为止。

以下是一个使用 make_parser 方法创建 SAX 解析器对象的简单示例:

import xml.sax

# 创建 SAX 解析器对象
parser = xml.sax.make_parser()

# 设置解析器的处理器
handler = MyHandler()
parser.setContentHandler(handler)

# 解析 XML 文件
parser.parse("example.xml")

在这个示例中,我们使用 make_parser 方法创建了一个默认的 SAX 解析器对象,并使用 setContentHandler方法将处理器对象设置为解析器的处理器。最后,我们使用 parse 方法解析 XML 文件。

需要注意的是,在使用 SAX 解析器解析 XML 文件时,需要自己实现处理器对象,并在处理器对象中处理 XML 文件中的事件。

parser 方法

在 Python 中,解析 XML 文件的常用方法之一是使用 xml.etree.ElementTree 模块中的 ElementTree 类。该类提供了一个 parse() 方法,用于解析 XML 文件并返回一个 ElementTree 对象,可以使用该对象来遍历和操作 XML 元素。
以下是一个示例代码:

import xml.etree.ElementTree as ET

# 解析 XML 文件
tree = ET.parse('example.xml')

# 获取根元素
root = tree.getroot()

# 遍历 XML 文件
for child in root:
    print(child.tag, child.attrib)
    for subchild in child:
        print(subchild.tag, subchild.text)
  • 在这个例子中,我们首先使用 ET.parse() 方法解析名为 example.xml 的 XML 文件,并将返回的ElementTree 对象存储在变量 tree 中。然后,我们使用 tree.getroot() 方法获取 XML文件的根元素,并将其存储在变量 root 中。
  • 接下来,我们使用 for 循环遍历根元素的子元素,并打印它们的标签和属性。然后,我们再次使用 for循环遍历每个子元素的子元素,并打印它们的标签和文本内容。
  • 需要注意的是,在遍历 XML 元素时,我们可以使用 tag 属性获取元素的标签名,使用 attrib 属性获取元素的属性,使用 text 属性获取元素的文本内容。此外,我们还可以使用 find()、findall() 和 iter() 等方法来查找和遍历 XML 元素。
  • 总的来说,使用 xml.etree.ElementTree 模块中的 ElementTree 类解析 XML 文件是一种简单而有效的方法,适用于大多数简单的 XML 文件。对于更复杂的 XML 文件,可能需要使用其他方法或库来解析和操作它们。
  • 26
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

以山河作礼。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值