在 Python 中创建 XML 解析器

Vaibhhav Khetarpal 2023年10月10日
  1. 在 Python 中使用 ElementTree API 解析 XML 文档
  2. 在 Python 中使用 minidom 模块解析 XML 文档
  3. 在 Python 中使用 Beautiful Soup 库解析 XML 文档
  4. 在 Python 中使用 xmltodict 库解析 XML 文档
  5. 在 Python 中使用 lxml 库解析 XML 文档
  6. 在 Python 中使用 untangle 模块解析 XML 文档
  7. 在 Python 中使用 declxml 库解析 XML 文档
在 Python 中创建 XML 解析器

XML 是可扩展标记语言的缩写,是一种用于存储和传输数据的自描述语言。Python 为解析和修改 XML 文档提供了一种媒介。

本教程重点介绍并演示了在 Python 中解析 XML 文档的不同方法。

在 Python 中使用 ElementTree API 解析 XML 文档

xml.etree.ElementTree 模块用于生成高效而简单的 API 来解析 XML 文档并创建 XML 数据。

以下代码使用 xml.etree.ElementTree 模块在 Python 中解析 XML 文档。

# >= Python 3.3 code
import xml.etree.ElementTree as ET

file1 = """<foo>
           <bar>
               <type foobar="Hello"/>
               <type foobar="God"/>
          </bar>
       </foo>"""
tree = ET.fromstring(file1)
x = tree.findall("bar/type")
for item in x:
    print(item.get("foobar"))

输出:

Hello
God

在这里,我们将 XML 数据作为三引号内的字符串传递。我们还可以在 ElementTree 模块的 parse() 函数的帮助下导入一个实际的 XML 文档。

cElementTree 模块是 ElementTree API 的 C 实现,唯一的区别是优化了 cElementTree。话虽如此,它的解析速度比 ElementTree 模块快 15-20 倍,并且使用的内存量非常低。

但是,在 Python 3.3 及更高版本中,cElementTree 模块已被弃用,而 ElementTree 模块使用更快的实现。

在 Python 中使用 minidom 模块解析 XML 文档

xml.dom.minidom 可以定义为文档对象模型 (DOM) 接口的基本实现。所有 DOM 应用程序通常都从解析 XML 对象开始。因此,该方法是 Python 中解析 XML 文档最快的方法。

以下代码使用 minidom 模块中的 parse() 函数来解析 Python 中的 XML 文档。

XML 文件 (sample1.xml):

<data>
    <strings>
        <string name="Hello"></string>
        <string name="God"></string>
    </strings>
</data>

Python 代码:

from xml.dom import minidom

xmldoc = minidom.parse("sample1.xml")
stringlist = xmldoc.getElementsByTagName("string")
print(len(stringlist))
print(stringlist[0].attributes["name"].value)
for x in stringlist:
    print(x.attributes["name"].value)

输出:

2
Hello
God

该模块还允许将 XML 作为字符串传递,类似于 ElementTree API。然而,它使用 parseString() 函数来实现这一点。

据说 xml.etree.ElementTreexml.dom.minidom 模块对于恶意构造的数据都是不安全的。

在 Python 中使用 Beautiful Soup 库解析 XML 文档

Beautiful Soup 库是为网页抓取项目和从 XMLHTML 文件中提取数据而设计的。美丽的汤速度非常快,可以解析它遇到的任何东西。

该库甚至为程序执行树遍历过程并解析 XML 文档。此外,Beautiful Soup 还用于美化给定的源代码。

Beautiful Soup 库需要手动安装,然后导入到此方法的 Python 代码中。这个库可以使用 pip 命令安装。Beautiful Soup 4 库是最新版本,适用于 Python 2.7 及更高版本。

以下代码使用 Beautiful Soup 库在 Python 中解析 XML 文档。

from bs4 import BeautifulSoup

file1 = """<foo>
   <bar>
      <type foobar="Hello"/>
      <type foobar="God"/>
   </bar>
</foo>"""

a = BeautifulSoup(file1)
print(a.foo.bar.type["foobar"])
print(a.foo.bar.findAll("type"))

输出:

u'Hello'
[<type foobar="Hello"></type>, <type foobar="God"></type>]

Beautiful Soup 比任何其他用于解析的工具都要快,但有时可能很难理解和实现这种方法。

在 Python 中使用 xmltodict 库解析 XML 文档

xmltodict 库有助于使处理 XML 文件的过程类似于 JSON。它也可以用于我们想要解析 XML 文件的情况。在这种情况下,可以通过将 XML 文件解析为 Ordered Dictionary 来使用 xmltodict 模块。

xmltodict 库需要手动安装,然后导入到包含 XML 文件的 Python 代码中。xmltodict 的安装非常基本,可以使用标准的 pip 命令完成。

以下代码使用 xmltodict 库来解析 Python 中的 XML 文档。

import xmltodict

file1 = """<foo>
             <bar>
                 <type foobar="Hello"/>
                 <type foobar="God"/>
             </bar>
        </foo> """
result = xmltodict.parse(file1)
print(result)

输出:

OrderedDict([(u'foo', OrderedDict([(u'bar', OrderedDict([(u'type', [OrderedDict([(u'@foobar', u'Hello')]), OrderedDict([(u'@foobar', u'God')])])]))]))])

在 Python 中使用 lxml 库解析 XML 文档

lxml 库能够在 Python 中提供一个简单但非常强大的 API,用于解析 XML 和 HTML 文件。它结合了 ElementTree API 和 libxml2/libxslt

简单来说,lxml 库进一步扩展了旧的 ElementTree 库,以提供对 XML Schema、XPath 和 XSLT 等新事物的支持。

在这里,我们将使用 lxml.objectify 库。以下代码使用 lxml 库在 Python 中解析 XML 文档。

from collections import defaultdict
from lxml import objectify

file1 = """<foo>
                <bar>
                    <type foobar="1"/>
                    <type foobar="2"/>
                </bar>
            </foo>"""

c = defaultdict(int)

root = objectify.fromstring(file1)

for item in root.bar.type:
    c[item.attrib.get("foobar")] += 1

print(dict(c))

输出:

{'1': 1, '2': 1}

在这里,在这个程序中,c 变量用于存储字典中每个可用项目的计数。

在 Python 中使用 untangle 模块解析 XML 文档

untangle 模块是一个易于实现的模块,专注于将 XML 转换为 Python 对象。它也可以使用 pip 命令轻松安装。此模块适用于 Python 2.7 及更高版本。

以下代码使用 untangle 模块在 Python 中解析 XML 文档。

XML 文件 (sample1.xml):

<foo>
   <bar>
      <type foobar="Hello"/>
   </bar>
</foo>

Python 代码:

import untangle

x = untangle.parse("/path_to_xml_file/sample1.xml")
print(x.foo.bar.type["foobar"])

输出:

Hello

在 Python 中使用 declxml 库解析 XML 文档

declxml 库是 Declarative XML Processing 的缩写,用于提供一个简单的 API 来序列化和解析 XML 文档。该库旨在减少程序员的工作量,并取代在使用其他流行的 API(例如 minidomElementTree)时,需要处理大而长的解析逻辑代码块。

declxml 模块可以通过使用 pippipenv 命令轻松安装在系统中。以下代码使用 declxml 库来解析 Python 中的 XML 文档。

import declxml as xml

xml_string = """
<foo>
   <bar>
      <type foobar="1"/>
      <type foobar="3"/>
      <type foobar="5"/>
   </bar>
</foo>
"""

processor = xml.dictionary(
    "foo", [xml.dictionary("bar", [xml.array(xml.integer("type", attribute="foobar"))])]
)

xml.parse_from_string(processor, xml_string)

输出:

{'bar': {'foobar': [1, 3, 5]}}

在这种方法中,我们使用处理器来声明性地表征给定 XML 文档的结构以及 XML 和 Python 数据结构之间的映射。

Vaibhhav Khetarpal avatar Vaibhhav Khetarpal avatar

Vaibhhav is an IT professional who has a strong-hold in Python programming and various projects under his belt. He has an eagerness to discover new things and is a quick learner.

LinkedIn

相关文章 - Python XML