python xml 解析

什么是 XML?

XML,即可扩展标记语言(eXtensible Markup Language),是一种用于存储和传输数据的标记语言。XML与HTML(超文本标记语言)相似,但XML的设计目的是传输数据,而不是显示数据。XML使用标签来描述数据,这些标签通常由用户定义,以便于数据的存储和交换。
以下是XML的一些关键特点:

  • 自我描述性:XML标签描述数据的内容,而不是如何显示数据。这意味着相同的XML数据可以在不同的应用程序和环境中使用,而不需要改变其结构。
  • 可扩展性:XML允许用户定义自己的标签。这意味着你可以为特定的数据类型创建专用的标记语言。
  • 平台无关性:XML是文本格式,因此可以在不同的系统和应用程序之间轻松地共享和传输数据。
  • 数据校验:XML支持使用XML Schema或DTD(文档类型定义)来定义数据的结构,从而确保数据的准确性和一致性。
  • 语言无关性:XML标签不依赖于任何特定的编程语言,这意味着它们可以在多种编程语言中使用。
  • 树状结构:XML文档被解析为树状结构,其中每个节点代表数据结构的一部分。

Python 对 XML 的解析

Python有多个库可以用来解析XML(可扩展标记语言),这些库提供了不同的功能和API,以满足各种需求。以下是几个常用的Python库,用于解析XML:
1.xml.etree.ElementTree:

  • 描述:这是Python标准库中内置的XML解析器,它提供了简单易用的接口来解析和创建XML文档。
  • 特点:
    • 速度快,效率高。
    • 支持XML命名空间。
    • 支持XPath查询。
  • 安装:无需安装,它是Python标准库的一部分。
    2.lxml:
  • 描述:lxml是一个第三方库,它提供了更强大的XML处理功能,包括XPath支持、XML Schema验证、HTML支持等。
  • 特点:
    • 速度快,效率高。
    • 支持XML命名空间。
    • 支持XPath、XSLT和XQuery。
    • 支持HTML和XML Schema。
  • 安装:使用pip安装。
pip install lxml

3.xml.dom:

  • 描述:这是Python标准库中的另一个XML解析器,它基于DOM(文档对象模型)API。
  • 特点:
    • 支持DOM接口,允许以编程方式访问XML文档的结构。
    • 支持XML命名空间。
    • 支持XPath查询。
  • 安装:无需安装,它是Python标准库的一部分。

4.xmltodict:

  • 描述:xmltodict是一个第三方库,它提供了一个功能,将Python的字典对象转换为XML,反之亦然。
  • 特点:
    • 方便地将Python字典转换为XML。
    • 支持嵌套的字典结构。
    • 安装:使用pip安装。
pip install xmltodict

5.cElementTree:

  • 描述:cElementTree是一个基于C语言的XML解析库,它提供了与ElementTree类似的功能,但可能更快。
  • 特点:
    • 速度快。
    • 支持XML命名空间。
    • 支持XPath查询。
  • 安装:使用pip安装。
pip install cElementTree

下面是一个使用xml.etree.ElementTree库解析XML的基本示例:

import xml.etree.ElementTree as ET

# 假设我们有一个XML字符串
xml_data = """
<book>
    <title lang="en">Good Omens</title>
    <author>
        <name>Neil Gaiman</name>
        <name>Terry Pratchett</name>
    </author>
    <year>1990</year>
</book>
"""

# 使用ElementTree解析XML
root = ET.fromstring(xml_data)

# 访问根元素
print("Root element:", root.tag)

# 访问title元素
title = root.find("title")
print("Title:", title.text)

# 访问author元素
author = root.find("author")
print("Author:", author.text)

# 访问name元素
names = list(author.findall("name"))
print("Names:", [name.text for name in names])

Python 使用 ElementTree 解析 xml

xml.etree.ElementTree模块是一个用于解析和创建XML文档的库。它是Python标准库的一部分,因此不需要单独安装。以下是如何使用ElementTree模块解析XML文档的基本步骤:

导入库

首先,你需要导入xml.etree.ElementTree模块。

import xml.etree.ElementTree as ET

解析XML字符串

你可以使用ElementTree的fromstring方法来解析一个字符串形式的XML。

xml_string = """
<book>
    <title lang="en">Good Omens</title>
    <author>
        <name>Neil Gaiman</name>
        <name>Terry Pratchett</name>
    </author>
    <year>1990</year>
</book>
"""

root = ET.fromstring(xml_string)

访问元素

一旦你有了根元素,你就可以使用各种方法来访问和操作XML文档中的元素。

  • 使用tag属性获取元素的标签名。
  • 使用text属性获取元素的文本内容。
  • 使用attrib属性获取元素的属性。
  • 使用find方法查找第一个与指定标签匹配的子元素。
  • 使用findall方法查找所有与指定标签匹配的子元素。
# 获取根元素的标签
print(root.tag)

# 获取根元素的文本内容
print(root.text)

# 获取根元素的属性
print(root.attrib)

# 查找第一个title元素
title = root.find("title")
print(title.text)

# 查找所有author元素
authors = root.findall("author")
for author in authors:
    print("Author:", author.text)

修改元素

你也可以修改解析后的XML元素。

# 修改title元素的文本内容
title.text = "The Nice and Accurate Prophecies of Agnes Nutter, Witch"

# 添加一个新的元素
new_year = ET.SubElement(root, "year")
new_year.text = "2006"

生成XML字符串

你可以使用ElementTree的方法将修改后的元素转换回XML字符串。

# 将修改后的元素转换为字符串
new_xml_string = ET.tostring(root, encoding="unicode")
print(new_xml_string)

Python 使用 SAX 解析 xml

SAX(Simple API for XML)是一种基于事件的XML解析方法。与DOM(文档对象模型)不同,SAX不构建整个XML文档的树状结构,而是在读取XML文档时逐行处理。这种方法通常比DOM更快,因为它不需要在内存中存储整个文档。
要在Python中使用SAX解析XML,你可以使用xml.sax模块。以下是如何使用SAX解析器来处理XML文档的基本步骤:

导入SAX解析器

首先,你需要导入xml.sax模块,并创建一个解析器。

from xml.sax import make_parser

创建一个处理器

处理器是一个实现了特定接口的类,它知道如何处理XML文档中的事件。

class XMLHandler(object):
    def __init__(self):
        self.current_data = ""
        self.stack = []

    def startElement(self, tag, attributes):
        self.stack.append(tag)
        self.current_data += f"<{'><'.join(self.stack)}>"

    def endElement(self, tag):
        self.stack.pop()
        self.current_data += f"</{tag}>"

    def charData(self, data):
        self.current_data += data

# 实例化处理器
handler = XMLHandler()

创建一个解析器并设置处理器

创建一个SAX解析器,并将处理器传递给它。

parser = make_parser()
parser.setContentHandler(handler)

解析XML文档

使用解析器解析XML文档。

xml_data = """
<book>
    <title lang="en">Good Omens</title>
    <author>
        <name>Neil Gaiman</name>
        <name>Terry Pratchett</name>
    </author>
    <year>1990</year>
</book>
"""

# 解析XML数据
parser.feed(xml_data)

获取解析结果

解析完成后,你可以从处理器中获取解析结果。

print(handler.current_data)

Python 解析XML实例

下面是一个完整的Python脚本,它使用xml.etree.ElementTree模块来解析一个XML文件,并打印出文件中的所有书籍信息。这个例子假设XML文件中包含了一个根元素,以及多个子元素,每个子元素都有、和等属性。

import xml.etree.ElementTree as ET

# 定义一个函数来解析XML文件
def parse_xml(file_path):
    # 解析XML文件
    tree = ET.parse(file_path)
    # 获取根元素
    root = tree.getroot()
    
    # 遍历所有书籍
    for book in root.findall('book'):
        # 获取并打印书籍的标题
        title = book.find('title').text
        print(f"Title: {title}")
        
        # 获取并打印书籍的作者
        author = book.find('author').text
        print(f"Author: {author}")
        
        # 获取并打印书籍的年份
        year = book.find('year').text
        print(f"Year: {year}")
        print("---" * 10)  # 打印分隔线

# 调用函数解析XML文件
# 请确保XML文件路径正确,例如: 'books.xml'
parse_xml('books.xml')

请确保将’books.xml’替换为你的XML文件的实际路径。XML文件应该有一个根元素,如下所示:

<books>
    <book>
        <title lang="en">Good Omens</title>
        <author>Neil Gaiman and Terry Pratchett</author>
        <year>1990</year>
    </book>
    <book>
        <title lang="en">The Hitchhiker's Guide to the Galaxy</title>
        <author>Douglas Adams</author>
        <year>1979</year>
    </book>
    <!-- ...更多书籍... -->
</books>

运行这个脚本后,它将解析XML文件,并打印出每本书的标题、作者和年份。

使用xml.dom解析xml

除了xml.etree.ElementTree模块,你还可以使用xml.dom模块来解析XML。xml.dom是基于DOM(文档对象模型)的,它允许你以编程方式访问XML文档的结构。以下是使用xml.dom解析XML文档的基本步骤:

导入库

首先,你需要导入xml.dom模块。

from xml.dom import minidom

解析XML字符串

你可以使用minidom的parseString方法来解析一个字符串形式的XML。

xml_string = """
<book>
    <title lang="en">Good Omens</title>
    <author>
        <name>Neil Gaiman</name>
        <name>Terry Pratchett</name>
    </author>
    <year>1990</year>
</book>
"""

# 解析XML字符串
dom = minidom.parseString(xml_string)

访问元素

一旦你有了DOM对象,你就可以使用各种方法来访问和操作XML文档中的元素。

  • 使用documentElement属性获取根元素。
  • 使用getElementsByTagName方法获取指定标签的所有子元素。
  • 使用firstChild和childNodes属性遍历元素。
# 获取根元素
root = dom.documentElement

# 获取所有book元素
books = root.getElementsByTagName("book")

# 遍历所有book元素
for book in books:
    title = book.getElementsByTagName("title")[0].firstChild.data
    author = book.getElementsByTagName("author")[0].firstChild.data
    year = book.getElementsByTagName("year")[0].firstChild.data
    print(f"Title: {title}")
    print(f"Author: {author}")
    print(f"Year: {year}")
    print("---" * 10)  # 打印分隔线

修改元素

你也可以修改解析后的XML元素,但请注意,xml.dom不支持动态修改文档结构。通常,你需要先将DOM转换为字符串,进行所需的修改,然后再解析回DOM。

生成XML字符串

你可以使用minidom的toprettyxml方法将DOM对象转换为格式化的XML字符串。

# 将DOM对象转换为字符串
pretty_xml_string = dom.toprettyxml()
print(pretty_xml_string)

相关推荐

  1. InterLM代码

    2024-03-11 01:32:02       34 阅读
  2. UV、PV

    2024-03-11 01:32:02       41 阅读
  3. Yaml语法

    2024-03-11 01:32:02       60 阅读
  4. Spring aspect

    2024-03-11 01:32:02       39 阅读
  5. thinkphp 模板

    2024-03-11 01:32:02       29 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-11 01:32:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-11 01:32:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-11 01:32:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-11 01:32:02       20 阅读

热门阅读

  1. 设计模式: 模板方法模式

    2024-03-11 01:32:02       23 阅读
  2. Linux命令

    2024-03-11 01:32:02       21 阅读
  3. 如何利用python实现自己的modbus-tcp库

    2024-03-11 01:32:02       23 阅读
  4. 《TCP/IP详解 卷一》第14章 TCP超时与重传

    2024-03-11 01:32:02       18 阅读
  5. Android学习笔记 Dialog

    2024-03-11 01:32:02       20 阅读
  6. 【Mysql优化】

    2024-03-11 01:32:02       19 阅读
  7. LeetCode 128 最长连续序列

    2024-03-11 01:32:02       21 阅读