用于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第三方库


热门话题
c#Java Tcp服务器和。Net Tcp客户端的发送和接收问题   安卓应用程序上的java标记地理位置,其位置位于我周围5Km半径范围内。   向java添加对话框并检索html文件   当eclipse甚至无法打开时,java会在eclipse中更改不兼容的JVM   java中同一jframe中的jlabel和paintComponent   基于另一数组排序的java排序   java AADSTS7000012:该补助金是为另一个租户获得的   java在JSF中使用foreach循环   java如何通过maven为运行junit测试创建运行配置?   java Selenium webDriver不稳定错误堆栈跟踪   java有没有办法创建以键为大写的JSON对象?