Skip to content
A Python object API for Orbeon XML
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.
orbeon_xml_api Author/copyright attribution. Oct 16, 2018
.gitignore Bump version 27. Jun 11, 2018
LICENSE MIT license Jul 17, 2017
requirements.txt Add requirement: xmlunittest Nov 19, 2017 Author/copyright attribution. Oct 16, 2018


Orbeon (Forms) XML API for Python.

For information about Orbeon, see Orbeon homepage


orbeon-xml-api is a Python package, which loads and transforms Orbeon Builder XML and Runner XML into usable Python objects. It's main aim is to provide easy access to a Form its controls/fields, also captured as Python objects, which makes this API very versatile and usable.

Notes about terms:

  • "Builder" could be read/seen as "Builder Form"
  • "Runner" could be read/seen as "Runner Form"
  • "Control" could be read/seen as "Field"


  • Compatible with Python 2.7 (GitHub issue to support 3.3 and later)
  • Constructor of the Builder and Runner class, only requires the XML and an optional language code for translations.
  • Get a Runner object Control/Fields as a usable object, by the Pythonic attribute-getter (__getattr__)
  • Get the value as Python object (e.g. DateTime object, dict) and attributes of a Runner Control/Field object, by Pythonic attribute-getter (__getattr__). Conversion of [Runner control-value to Python object][runner-control-value-to-python-object] e.g. DateTime, Boolean, Dict etc.
  • Merging a Runner with a updates/changes in Builder. This results in a new Runner, which kept it's former controls and merged new controls from the Builder into it.
  • Open source (MIT License)


The source code is currently hosted on GitHub at:

Binary installers for the latest released version are available at the Python package index

# PyPI
pip install orbeon-xml-api

Dependencies: lxml, xmltodict, xmlunittest




All contributions, bug reports, bug fixes, documentation improvements, enhancements and ideas are welcome.

Usage examples

For more examples of usage, see the unit-tests.

>> from orbeon-xml-api import Builder, Runner
# builder_xml is an Orbeon Builder XML document (text/string)
# runner_xml is an Orbeon Runner XML document (text/string)
>> builder = Builder(builder_xml)
>> runner = Runner(builder, runner_xml)

# Text Field (control)
>> runner.form.firstname.label
'First Name'

# Raw XML value
>> print runner.form.firstname.raw_value

# Value as Python string too
>> print runner.form.firstname.value

# Date (control)
>> print runner.form.birthday.label

# Raw XML
>> print runner.form.birthday.raw_value

# Value as Python Date object
>> print runner.form.birthday.value 10 16)

# Selection Checkboxes (control)
>> print runner.form.favorite_dishes.label
'Favorite dishes'

# Raw XML
>> print runner.form.favorite_dishes.raw_value
'mixgrill pizza sushi'

# Choices as Python dict (key => choice value, value => choice label)
>> print runner.form.favorite_dishes.choices
{'mixgrill': 'Mixed Grill, 'pizza': 'Pizza', 'sushi': 'Sushi'}

# Choices labels as Python list
>> print runner.form.favorite_dishes.choices_labels
['Mixed Grill, 'Pizza', 'Sushi']

# Choices values as Python list
>> print runner.form.favorite_dishes.choices_values
['grill, 'pizza', 'sushi']

Unit tests


Currently with nose. Standard Python unittest crashes.

Install nose:

pip install nose

Run nosetests:


nosetests tests/controls
nosetests tests.controls

nosetests tests/controls/

Send nose STDOUT (pdb support):

nosetests -s

Performance tests (timers) - install nose-timer:

pip install nose-timer

nosetests --with-timer

Python unittest (currently crashes)

python -m unittest tests.test_builder
python -m unittest tests.test_runner
You can’t perform that action at this time.