跳转到主要内容

ElementTree和lxml的XPath 1.0/2.0/3.0/3.1解析器和选择器

项目描述

https://img.shields.io/pypi/v/elementpath.svg https://img.shields.io/pypi/pyversions/elementpath.svg https://img.shields.io/pypi/implementation/elementpath.svg MIT License https://img.shields.io/pypi/dm/elementpath.svg

该软件包的目的是为ElementTree XML数据结构提供XPath 1.0、2.0、3.0和3.1选择器,适用于标准ElementTree库和lxml.etree库。

对于lxml.etree,该软件包可以用于提供XPath 2.0/3.0/3.1选择器,因为lxml.etree已经有了XPath 1.0的实现。

安装和使用

您可以在Python 3.8+环境中使用pip安装该软件包

pip install elementpath

要使用它,请导入软件包并在ElementTree节点上应用选择器

>>> import elementpath
>>> from xml.etree import ElementTree
>>> root = ElementTree.XML('<A><B1/><B2><C1/><C2/><C3/></B2></A>')
>>> elementpath.select(root, '/A/B2/*')
[<Element 'C1' at ...>, <Element 'C2' at ...>, <Element 'C3' at ...>]

《select》API 提供了标准的 XPath 结果格式,该格式为列表或基本数据类型的值。如果您只想遍历结果,可以使用接受与《select》相同参数的生成器函数《iter_select》。

选择器 API 也使用基于《lxml.etree》库的 XML 数据树。

>>> import elementpath
>>> import lxml.etree as etree
>>> root = etree.XML('<A><B1/><B2><C1/><C2/><C3/></B2></A>')
>>> elementpath.select(root, '/A/B2/*')
[<Element C1 at ...>, <Element C2 at ...>, <Element C3 at ...>]

当您需要将相同的 XPath 表达式应用于多个 XML 数据时,也可以使用《Selector》类,创建一个实例,然后将其用于对不同的 XML 数据应用路径。

>>> import elementpath
>>> import lxml.etree as etree
>>> selector = elementpath.Selector('/A/*/*')
>>> root = etree.XML('<A><B1/><B2><C1/><C2/><C3/></B2></A>')
>>> selector.select(root)
[<Element C1 at ...>, <Element C2 at ...>, <Element C3 at ...>]
>>> root = etree.XML('<A><B1><C0/></B1><B2><C1/><C2/><C3/></B2></A>')
>>> selector.select(root)
[<Element C0 at ...>, <Element C1 at ...>, <Element C2 at ...>, <Element C3 at ...>]

公共 API 类和函数在“Read the Docs”网站上的《elementpath》手册中描述。

默认情况下使用 XPath 2.0。如果您需要 XPath 1.0 解析器,请提供《parser》参数。

>>> from elementpath import select, XPath1Parser
>>> from xml.etree import ElementTree
>>> root = ElementTree.XML('<A><B1/><B2><C1/><C2/><C3/></B2></A>')
>>> select(root, '/A/B2/*', parser=XPath1Parser)
[<Element 'C1' at ...>, <Element 'C2' at ...>, <Element 'C3' at ...>]

对于 XPath 3.0/3.1,从《elementpath.xpath3》子包导入解析器,该子包默认不加载。

>>> from elementpath.xpath3 import XPath3Parser
>>> select(root, 'math:atan(1.0e0)', parser=XPath3Parser)
0.7853981633974483

注意:《XPath3Parser》是《XPath31Parser》的别名。

如果您只需要 XPath 3.0,也可以使用更具体的子包,避免加载 XPath 3.1 实现。

>>> from elementpath.xpath30 import XPath30Parser
>>> select(root, 'math:atan(1.0e0)', parser=XPath30Parser)
0.7853981633974483

贡献

您可以通过报告错误、使用问题跟踪器或通过拉取请求来为此软件包做出贡献。如果您打开一个问题,请尝试提供一个测试或测试数据以重现错误行为。提供的测试代码应添加到软件包的测试中。

XPath 解析器基于 Pratt 的自顶向下操作符优先级解析器实现。实现的解析器包括一些查找前瞻功能,注册令牌和扩展语言实现的辅助工具。此外,令牌类已使用《MutableSequence》作为基类进行泛化。有关基本内部类,请参阅《tdop.py》,有关扩展和解析器的基本用法,请参阅《xpath1_parser.py》。

如果您喜欢,可以使用《tdop.py》模块提供的基解析器和令牌来实现其他类型的解析器(我认为这可能也是一个有趣的练习!)。

许可证

本软件根据 MIT 许可证的条款进行分发。请参阅当前分发根目录中的“LICENSE”文件,或访问https://open-source.org.cn/licenses/MIT

项目详情


发布历史 发布通知 | RSS 源

下载文件

下载您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

elementpath-4.5.0.tar.gz (338.7 kB 查看哈希值)

上传时间 源代码

构建分发

elementpath-4.5.0-py3-none-any.whl (228.8 kB 查看哈希值)

上传时间 Python 3