用于elementtree和lxml的xpath 1.0/2.0解析器和选择器

elementpath的Python项目详细描述


这个包的建议是为python的elementtree xml提供xpath 1.0和2.0选择器。 标准元素树库和 lxml.etree库。

对于lxml.etree这个包可用于提供xpath 2.0选择器, 因为lxml.etree已经有了自己的xpath 1.0实现。

安装和使用

您可以在python 2.7或python 3.5+环境中安装带有pip的包:

pip install elementpath

要使用它,请导入包并在元素树节点上应用选择器:

>>> 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 ...>]

selectapi提供标准的xpath结果格式,它是一个列表或元素 数据类型的值。如果只想遍历结果,可以使用generator函数 iter\u select接受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类和函数在 elementpath manual on the “Read the Docs” site

贡献

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

xpath解析器基于pratt的自顶向下运算符优先解析器的实现。 实现的解析器包括一些预先查找功能、用于注册令牌和 扩展语言实现。此外,token类已使用可变序列进行了泛化。 作为基类。基本内部类请参见tdop_parser.py,扩展请参见xpath1_parser.py。 以及解析器的基本用法。

如果愿意,可以使用{em1}$tdop parser.py模块提供的基本解析器和标记来 实现其他类型的解析器(我认为这也是一个有趣的练习!).

许可证

这个软件是根据麻省理工学院的许可条款发行的。 请参阅当前根目录中的“license”文件 分布,或http://opensource.org/licenses/MIT

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
保存一段xml是一个新的xml解析器Java   java如何使用断言测试单链表。assertEquals()   java如何将多个选定图像从Gallery复制到Android中的另一个文件夹   重新触发异常时调用序列中的java差异   swing如何在Java中的GridLayout面板的特定单元格中添加标签?   java在更新引用实体之后,有没有办法更新其他实体中的列?   java如何在两个实体之间使用foreach   java方法add(Component)不适用于参数   Apache Tiles和Spring MVC中的java全局异常页面   java kSoap2发送集合   Java存储对象与直接调用其方法的性能对比?   java如何访问selenium中的nowrap元素   使用endpointsframeworktools生成OpenAPI文档时发生java错误   西/东方向的java JLabel不会显示在BorderLayout中   java ActiveMQ Spring客户端:如何更改处理器池?   java不能取消对void的引用;尝试使用生成器模式   javajavax。websocketclient:如何将大型二进制数据从clientendpoint发送到serverendpoint   运行Java代理时Java代理问题   如何将Web应用程序连接到Java/ABAP应用程序   javajackson处理问题