Skip to main content

XPath 1.0/2.0/3.0/3.1 parsers and selectors for ElementTree and lxml

Project description

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

The proposal of this package is to provide XPath 1.0, 2.0, 3.0 and 3.1 selectors for ElementTree XML data structures, both for the standard ElementTree library and for the lxml.etree library.

For lxml.etree this package can be useful for providing XPath 2.0/3.0/3.1 selectors, because lxml.etree already has it’s own implementation of XPath 1.0.

Installation and usage

You can install the package with pip in a Python 3.10+ environment:

pip install elementpath

For using it import the package and apply the selectors on ElementTree nodes:

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

The select API provides the standard XPath result format that is a list or an elementary datatype’s value. If you want only to iterate over results you can use the generator function iter_select that accepts the same arguments of select.

The selectors API works also using XML data trees based on the lxml.etree library:

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

When you need to apply the same XPath expression to several XML data you can also use the Selector class, creating an instance and then using it to apply the path on distinct XML data:

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

Public API classes and functions are described into the elementpath manual on the “Read the Docs” site.

For default the XPath 2.0 is used. If you need XPath 1.0 parser provide the parser argument:

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

For XPath 3.0/3.1 import the parser from elementpath.xpath3 subpackage, that is not loaded for default:

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

Note: XPath3Parser is an alias of XPath31Parser.

If you need only XPath 3.0 you can also use a more specific subpackage, avoiding the loading of XPath 3.1 implementation:

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

About parsers

The XPath parsers are based on an implementation of the Pratt’s Top Down Operator Precedence parser. The implemented parser includes some lookup-ahead features, helpers for registering tokens and for extending language implementations. Also the token class has been generalized using a MutableSequence as base class. See tdop.py for the basic internal classes and xpath1_parser.py for extensions and for a basic usage of the parser.

If you like you can use the basic parser and tokens provided by the tdop.py module to implement other types of parsers (I think it could be also a funny exercise!).

Contributing

Contributions to this package are welcome. Please see the CONTRIBUTING.rst file for guidelines on how to contribute, including the development setup, testing, and our AI policy.

License

This software is distributed under the terms of the MIT License. See the file ‘LICENSE’ in the root directory of the present distribution, or http://opensource.org/licenses/MIT.

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

elementpath-5.1.3.tar.gz (378.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

elementpath-5.1.3-py3-none-any.whl (260.3 kB view details)

Uploaded Python 3

File details

Details for the file elementpath-5.1.3.tar.gz.

File metadata

  • Download URL: elementpath-5.1.3.tar.gz
  • Upload date:
  • Size: 378.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.5

File hashes

Hashes for elementpath-5.1.3.tar.gz
Algorithm Hash digest
SHA256 35e98cc2e26332305a49b32eaaebfb7289d1963c88d3989ff5ccb02c46809820
MD5 92b70d91db1850c62f69b1f3e1287cdc
BLAKE2b-256 641832c3a5cb3d1e5ce691757cd627bd15ae19aafb45a7c966fce16022ff6b70

See more details on using hashes here.

File details

Details for the file elementpath-5.1.3-py3-none-any.whl.

File metadata

  • Download URL: elementpath-5.1.3-py3-none-any.whl
  • Upload date:
  • Size: 260.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.5

File hashes

Hashes for elementpath-5.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 c46f5e0e36c149b892308843e1e394bdee17ceafbc18cfa39250403dd8475a4e
MD5 8e23d420b7248d3f9892845899c428ee
BLAKE2b-256 3711317824213350e6bf7af8aa4238cb78bec9ca014b89fdd5e25283f1c40d98

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page