Python3 XML 解析
                           
天天向上
发布: 2025-03-16 12:48:21

原创
773 人浏览过

在 Python3 中,解析和处理 XML 文件可以通过多个模块来实现,最常用的模块是 xml.etree.ElementTreelxml。下面将详细解析如何使用 Python3 进行 XML 解析。

1. 使用 xml.etree.ElementTree 解析 XML

xml.etree.ElementTree 是 Python 标准库的一部分,它提供了简单的 API 来处理 XML 文档。这个模块适合处理不太复杂的 XML 文件。

1.1 解析 XML 文件

import xml.etree.ElementTree as ET

# 解析 XML 文件
tree = ET.parse("example.xml")  # 加载 XML 文件
root = tree.getroot()  # 获取 XML 根元素

# 打印根元素的标签
print("Root element:", root.tag)

# 遍历所有子元素
for child in root:
    print(child.tag, child.attrib)

1.2 解析字符串中的 XML

如果你有一个 XML 字符串而不是文件,可以使用 fromstring() 方法直接解析。

import xml.etree.ElementTree as ET

# XML 字符串
xml_data = """
<library>
    <book>
        <title>Python Programming</title>
        <author>John Doe</author>
    </book>
    <book>
        <title>XML Parsing in Python</title>
        <author>Jane Smith</author>
    </book>
</library>
"""

# 解析 XML 字符串
root = ET.fromstring(xml_data)

# 打印 XML 元素
for book in root.findall("book"):
    title = book.find("title").text
    author = book.find("author").text
    print(f"Title: {title}, Author: {author}")

1.3 创建 XML 文档

xml.etree.ElementTree 也支持创建新的 XML 文档。

import xml.etree.ElementTree as ET

# 创建根元素
root = ET.Element("library")

# 创建子元素
book1 = ET.SubElement(root, "book")
title1 = ET.SubElement(book1, "title")
title1.text = "Python Programming"
author1 = ET.SubElement(book1, "author")
author1.text = "John Doe"

# 创建 ElementTree 对象
tree = ET.ElementTree(root)

# 保存到文件
tree.write("output.xml")

1.4 查找元素

  • find(): 查找第一个匹配的元素。
  • findall(): 查找所有匹配的元素。
  • iter(): 遍历整个树的元素。
# 查找第一个匹配的元素
title = root.find(".//title").text  # 使用 XPath 表达式查找
print("First title:", title)

# 查找所有书籍元素
books = root.findall("book")
for book in books:
    print(book.find("title").text)

1.5 修改 XML 内容

可以修改元素的文本内容或属性。

# 修改元素的文本内容
first_book = root.find("book")
first_book.find("title").text = "Advanced Python Programming"

# 修改元素的属性
first_book.set("year", "2021")

# 保存修改后的 XML
tree.write("modified.xml")

2. 使用 lxml 解析 XML

lxml 是一个功能更强大的库,支持 XPath 和 XSLT 等高级功能。与 xml.etree.ElementTree 相比,lxml 提供了更多的特性和更高效的性能,尤其适用于大型 XML 文件。

2.1 安装 lxml

pip install lxml

2.2 解析 XML 文件

from lxml import etree

# 解析 XML 文件
tree = etree.parse("example.xml")
root = tree.getroot()

# 打印根元素标签
print("Root element:", root.tag)

# 遍历所有子元素
for child in root:
    print(child.tag, child.attrib)

2.3 使用 XPath 查找元素

lxml 支持 XPath,可以更方便地查找复杂的元素。

from lxml import etree

# 解析 XML
tree = etree.parse("example.xml")
root = tree.getroot()

# 使用 XPath 查找所有书籍标题
titles = root.xpath("//book/title/text()")
for title in titles:
    print("Title:", title)

2.4 创建和修改 XML 文档

xml.etree.ElementTree 类似,lxml 也支持创建和修改 XML 文档。

from lxml import etree

# 创建 XML 元素
root = etree.Element("library")
book1 = etree.SubElement(root, "book")
title1 = etree.SubElement(book1, "title")
title1.text = "Python Programming"
author1 = etree.SubElement(book1, "author")
author1.text = "John Doe"

# 创建 XML 树并写入文件
tree = etree.ElementTree(root)
tree.write("output_lxml.xml", pretty_print=True)

2.5 修改 XML 内容

from lxml import etree

# 解析 XML
tree = etree.parse("example.xml")
root = tree.getroot()

# 修改书籍标题
first_book = root.find(".//book")
first_book.find("title").text = "Advanced Python Programming"

# 保存修改后的 XML
tree.write("modified_lxml.xml", pretty_print=True)

3. 处理 XML 属性

XML 元素可以有属性,xml.etree.ElementTreelxml 都支持访问和修改属性。

# 使用 xml.etree.ElementTree
root = ET.Element("library")
book = ET.SubElement(root, "book", year="2021")
book.set("author", "John Doe")

print(book.attrib)  # 打印属性
# 使用 lxml
book = etree.Element("book", year="2021", author="John Doe")
print(book.attrib)  # 打印属性

4. 处理 XML 命名空间

XML 命名空间(namespace)用于避免元素名称的冲突。如果 XML 中包含命名空间,需要特别处理。

import xml.etree.ElementTree as ET

xml_data = """
<ns:library xmlns:ns="http://example.com/ns">
    <ns:book>
        <ns:title>Python Programming</ns:title>
        <ns:author>John Doe</ns:author>
    </ns:book>
</ns:library>
"""

root = ET.fromstring(xml_data)

# 使用命名空间查找元素
namespaces = {"ns": "http://example.com/ns"}
title = root.find(".//ns:title", namespaces).text
print("Title:", title)

5. 总结

  • xml.etree.ElementTree:适用于简单的 XML 解析任务,提供了基本的 API,操作起来比较方便。
  • lxml:功能更强大,支持 XPath、XSLT 等高级功能,适合处理复杂或大型的 XML 文档。
  • 在解析 XML 文件时,可以选择基于元素标签或者属性来查找所需内容,lxml 提供了更多的灵活性,尤其在进行 XPath 查询时。
  • 解析 XML 后,你可以方便地修改 XML 内容,并将结果写入文件。

更多详细内容请关注其他相关文章!

发表回复 0

Your email address will not be published. Required fields are marked *