Metadata-Version: 2.1
Name: django-xml
Version: 2.1.0
Summary: Provides an abstraction to lxml's XPath and XSLT functionality in a manner resembling django database models
Home-page: https://github.com/theatlantic/django-xml
Author: The Atlantic
Author-email: atmoprogrammers@theatlantic.com
License: UNKNOWN
Platform: UNKNOWN
Classifier: Environment :: Web Environment
Classifier: Intended Audience :: Developers
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Framework :: Django
Requires-Dist: lxml
Requires-Dist: pytz
Requires-Dist: python-dateutil
Requires-Dist: Django (>=1.11)

django-xml
##########

.. image:: https://travis-ci.org/theatlantic/django-xml.svg?branch=master
    :target: https://travis-ci.org/theatlantic/django-xml


**django-xml** is a python module which provides an abstraction to
`lxml <http://lxml.de/>`_'s XPath and XSLT functionality in a manner
resembling django database models.

Note
====

* Version 2.0 drops support for Django < 1.11
* Version 2.0.1 drops support for Python 3.4
* Version 3.0 will drop support for Python < 3.5


Installation
============

To install the latest stable release of django-xml, use pip or
easy\_install

::

    pip install django-xml
    easy_install django-xml

For the latest development version, install from source with pip:

::

    pip install -e git+git://github.com/theatlantic/django-xml#egg=django-xml

If the source is already checked out, install via setuptools:

::

    python setup.py develop

Example
=======

::

    import math
    from djxml import xmlmodels

    class NumbersExample(xmlmodels.XmlModel):

        class Meta:
            extension_ns_uri = "urn:local:number-functions"
            namespaces = {"fn": extension_ns_uri,}

        all_numbers  = xmlmodels.XPathIntegerListField("//num")
        even_numbers = xmlmodels.XPathIntegerListField("//num[fn:is_even(.)]")
        sqrt_numbers = xmlmodels.XPathFloatListField("fn:sqrt(//num)")

        @xmlmodels.lxml_extension
        def is_even(self, context, number_nodes):
            numbers = [getattr(n, 'text', n) for n in number_nodes]
            return all([bool(int(num) % 2 == 0) for num in numbers])

        @xmlmodels.lxml_extension
        def sqrt(self, context, number_nodes):
            sqrts = []
            for number_node in number_nodes:
                number = getattr(number_node, 'text', number_node)
                sqrts.append(repr(math.sqrt(int(number))))
            return sqrts

    def main():
        numbers_xml = u"""
        <numbers>
            <num>1</num>
            <num>2</num>
            <num>3</num>
            <num>4</num>
            <num>5</num>
            <num>6</num>
            <num>7</num>
        </numbers>"""

        example = NumbersExample.create_from_string(numbers_xml)

        print "all_numbers  = %r" % example.all_numbers
        print "even_numbers = %r" % example.even_numbers
        print "sqrt_numbers = [%s]" % ', '.join(['%.3f' % n for n in example.sqrt_numbers])
        # all_numbers  = [1, 2, 3, 4, 5, 6, 7]
        # even_numbers = [2, 4, 6]
        # sqrt_numbers = [1.000, 1.414, 1.732, 2.000, 2.236, 2.449, 2.646]

    if __name__ == '__main__':
        main()

Advanced Example
================

An example of django-xml usage which includes XsltField and
@lxml\_extension methods can be found
`here <https://github.com/theatlantic/django-xml/blob/master/docs/advanced_example.md>`_.

API Documentation
=================

`Read API documentation on github <https://github.com/theatlantic/django-xml#api-documentation>`_


