在 Python 中创建 XML 解析器
-
在 Python 中使用
ElementTree
API 解析 XML 文档 -
在 Python 中使用
minidom
模块解析 XML 文档 -
在 Python 中使用
Beautiful Soup
库解析 XML 文档 -
在 Python 中使用
xmltodict
库解析 XML 文档 -
在 Python 中使用
lxml
库解析 XML 文档 -
在 Python 中使用
untangle
模块解析 XML 文档 -
在 Python 中使用
declxml
库解析 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.ElementTree
和 xml.dom.minidom
模块对于恶意构造的数据都是不安全的。
在 Python 中使用 Beautiful Soup
库解析 XML 文档
Beautiful Soup
库是为网页抓取项目和从 XML
和 HTML
文件中提取数据而设计的。美丽的汤
速度非常快,可以解析它遇到的任何东西。
该库甚至为程序执行树遍历过程并解析 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(例如 minidom
或 ElementTree
)时,需要处理大而长的解析逻辑代码块。
declxml
模块可以通过使用 pip
或 pipenv
命令轻松安装在系统中。以下代码使用 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 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