用于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。