{ "info": { "author": "Greg Atkin", "author_email": "greg.scott.atkin@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3" ], "description": "# declxml - Declarative XML Processing\n\n[![PyPI version](https://badge.fury.io/py/declxml.svg)](https://badge.fury.io/py/declxml)\n[![Python Versions](https://img.shields.io/pypi/pyversions/declxml.svg)](https://pypi.org/project/declxml/)\n[![Build Status](https://gregscottatkin.visualstudio.com/declxml/_apis/build/status/gatkin.declxml)](https://gregscottatkin.visualstudio.com/declxml/_build/latest?definitionId=1)\n[![codecov](https://codecov.io/gh/gatkin/declxml/branch/master/graph/badge.svg)](https://codecov.io/gh/gatkin/declxml)\n[![Documentation Status](https://readthedocs.org/projects/declxml/badge/?version=latest)](https://declxml.readthedocs.io/en/latest/?badge=latest)\n[![License](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/gatkin/declxml/blob/master/LICENSE)\n\nXML processing made easy. No more writing and maintaining dozens or hundreds of lines of imperative serialization and parsing logic. With declxml, you declaratively define the structure of your XML document and let declxml handle the rest.\n\n## Installation\n\nInstall using either pip\n\n```bash\npip install declxml\n```\n\nor [Pipenv](https://docs.pipenv.org/)\n\n```bash\npipenv install declxml\n```\n\n## Documentation\n\nFor detailed documentation, see the project's [documentation page](http://declxml.readthedocs.io/).\n\n## Usage\n\nGiven some XML to process\n\n```xml\n\n Robert A. Heinlein\n 1907\n \n Starship Troopers\n 1959\n \n \n Stranger in a Strange Land\n 1961\n \n\n```\n\nCreate a declxml processor that defines the structure of the document\n\n```python\n>>> import declxml as xml\n\n>>> author_processor = xml.dictionary('author', [\n... xml.string('name'),\n... xml.integer('birth-year'),\n... xml.array(xml.dictionary('book', [\n... xml.string('title'),\n... xml.integer('published')\n... ]), alias='books')\n... ])\n\n```\n\nThen use that processor to parse the XML data\n\n```python\n>>> from pprint import pprint\n>>> author_xml = \"\"\"\n... \n... Robert A. Heinlein\n... 1907\n... \n... Starship Troopers\n... 1959\n... \n... \n... Stranger in a Strange Land\n... 1961\n... \n... \n... \"\"\"\n>>> pprint(xml.parse_from_string(author_processor, author_xml))\n{'birth-year': 1907,\n 'books': [{'published': 1959, 'title': 'Starship Troopers'},\n {'published': 1961, 'title': 'Stranger in a Strange Land'}],\n 'name': 'Robert A. Heinlein'}\n\n```\n\nThe same processor can also be used to serialize data to XML\n\n```python\n>>> author = {\n... 'birth-year': 1920,\n... 'name': 'Issac Asimov',\n... 'books': [\n... {\n... 'title': 'I, Robot',\n... 'published': 1950\n... },\n... {\n... 'title': 'Foundation',\n... 'published': 1951\n... }\n... ]\n... }\n\n\n>>> print(xml.serialize_to_string(author_processor, author, indent=' '))\n\n\n Issac Asimov\n 1920\n \n I, Robot\n 1950\n \n \n Foundation\n 1951\n \n\n\n```\n\nWant to work with objects instead of dictionaries? You can do that with declxml too\n\n```python\n>>> class Author:\n...\n... def __init__(self):\n... self.name = None\n... self.birth_year = None\n... self.books = []\n...\n... def __repr__(self):\n... return 'Author(name=\\'{}\\', birth_year={}, books={})'.format(\n... self.name, self.birth_year, self.books)\n\n>>> class Book:\n...\n... def __init__(self):\n... self.title = None\n... self.published = None\n...\n... def __repr__(self):\n... return 'Book(title=\\'{}\\', published={})'.format(self.title, self.published)\n...\n\n>>> author_processor = xml.user_object('author', Author, [\n... xml.string('name'),\n... xml.integer('birth-year', alias='birth_year'),\n... xml.array(xml.user_object('book', Book, [\n... xml.string('title'),\n... xml.integer('published')\n... ]), alias='books')\n... ])\n\n>>> xml.parse_from_string(author_processor, author_xml)\nAuthor(name='Robert A. Heinlein', birth_year=1907, books=[Book(title='Starship Troopers', published=1959), Book(title='Stranger in a Strange Land', published=1961)])\n\n```\n\nWhat about namedtuples, you say? Those are extremely useful, and declxml lets you work with them as well\n\n```python\n>>> from collections import namedtuple\n\n\n>>> Author = namedtuple('Author', ['name', 'birth_year', 'books'])\n>>> Book = namedtuple('Book', ['title', 'published'])\n\n\n>>> author_processor = xml.named_tuple('author', Author, [\n... xml.string('name'),\n... xml.integer('birth-year', alias='birth_year'),\n... xml.array(xml.named_tuple('book', Book, [\n... xml.string('title'),\n... xml.integer('published')\n... ]), alias='books')\n... ])\n\n>>> xml.parse_from_string(author_processor, author_xml)\nAuthor(name='Robert A. Heinlein', birth_year=1907, books=[Book(title='Starship Troopers', published=1959), Book(title='Stranger in a Strange Land', published=1961)])\n\n```", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://declxml.readthedocs.io/", "keywords": "XML,Parsing,Serialization", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "declxml", "package_url": "https://pypi.org/project/declxml/", "platform": "", "project_url": "https://pypi.org/project/declxml/", "project_urls": { "Documentation": "http://declxml.readthedocs.io/", "Homepage": "http://declxml.readthedocs.io/", "Source": "https://github.com/gatkin/declxml", "Tracker": "https://github.com/gatkin/declxml/issues" }, "release_url": "https://pypi.org/project/declxml/1.1.3/", "requires_dist": null, "requires_python": "", "summary": "Declarative XML processing library", "version": "1.1.3" }, "last_serial": 4775900, "releases": { "0.10.0": [ { "comment_text": "", "digests": { "md5": "54a169b2ea256ae5a1ef45644788fb32", "sha256": "9f462289c9c994ddae2d61bdb604cb79435fc211a2d03b9a926f0d81386f07a7" }, "downloads": -1, "filename": "declxml-0.10.0-py2-none-any.whl", "has_sig": false, "md5_digest": "54a169b2ea256ae5a1ef45644788fb32", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 8732, "upload_time": "2017-11-13T02:23:12", "url": "https://files.pythonhosted.org/packages/cb/19/89c59078aab35910a1e52bd79585ab920d300b20c1739e934b34bfe3c259/declxml-0.10.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1549728c04a4174d8ff20289982c0bab", "sha256": "ca82771baaf9093d65b6e9021540352daad984abf915b5971361f3a7170fdbbb" }, "downloads": -1, "filename": "declxml-0.10.0-py3-none-any.whl", "has_sig": false, "md5_digest": "1549728c04a4174d8ff20289982c0bab", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8732, "upload_time": "2017-11-13T02:23:13", "url": "https://files.pythonhosted.org/packages/17/3d/d1121a1ccc0086c4386d727737993464ad93bbb915bf41266463ae6ae0ec/declxml-0.10.0-py3-none-any.whl" } ], "0.11.0": [ { "comment_text": "", "digests": { "md5": "04082ac0ca1c72e2da105e6803c519b3", "sha256": "8a09b0aef0003d120e7213c2bbf54ad79b78bcdf1f0badbf3b7ed9cba670c1ec" }, "downloads": -1, "filename": "declxml-0.11.0-py2-none-any.whl", "has_sig": false, "md5_digest": "04082ac0ca1c72e2da105e6803c519b3", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 8704, "upload_time": "2018-02-04T22:48:49", "url": "https://files.pythonhosted.org/packages/c5/2a/4889909def4731a5d277a1973eab801aed89bd3fcf82a4bb30f55575bc43/declxml-0.11.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ba0577a60be3b23653cd8c2e351bd119", "sha256": "50cbc3758e423cfbb2e58d3e78e41817a4535077387da0f0c3f5a74ccafb79f6" }, "downloads": -1, "filename": "declxml-0.11.0-py3-none-any.whl", "has_sig": false, "md5_digest": "ba0577a60be3b23653cd8c2e351bd119", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8702, "upload_time": "2018-02-04T22:48:50", "url": "https://files.pythonhosted.org/packages/09/34/dfb4324ecc5ea54ff91b22b06632309c393c39f288e4d9844e5247439a42/declxml-0.11.0-py3-none-any.whl" } ], "0.9.0": [ { "comment_text": "", "digests": { "md5": "55b8e27fcfd7a995f8a3f66440130e21", "sha256": "7714b76527f43dadde4208700385ec2f4fa3831106f907d935a1bcbb3fe30a04" }, "downloads": -1, "filename": "declxml-0.9.0-py3-none-any.whl", "has_sig": false, "md5_digest": "55b8e27fcfd7a995f8a3f66440130e21", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 10000, "upload_time": "2017-09-04T01:55:06", "url": "https://files.pythonhosted.org/packages/7d/49/c136de9d98cc91f9fb31ebe04d734381b54f4ac0de8a1175e6a2e872bb75/declxml-0.9.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1d47a6d602549939efa3eb14716dbee5", "sha256": "19e7fa286486688af3efed6e156d64205cba64a9e3e14bab7cc78884ccaf42ba" }, "downloads": -1, "filename": "declxml-0.9.0.tar.gz", "has_sig": false, "md5_digest": "1d47a6d602549939efa3eb14716dbee5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7478, "upload_time": "2017-09-04T01:55:07", "url": "https://files.pythonhosted.org/packages/a6/53/af70a32d2ea339e834203302636dbda175697d7673bd572f9a5133324f97/declxml-0.9.0.tar.gz" } ], "0.9.1": [ { "comment_text": "", "digests": { "md5": "5c25cdad9baec398e26c0ca368e5f57a", "sha256": "bf1d45537c0b31f120323970e5ec0a595569a4a48c4c75570b4c2f17ab1103ba" }, "downloads": -1, "filename": "declxml-0.9.1-py3-none-any.whl", "has_sig": false, "md5_digest": "5c25cdad9baec398e26c0ca368e5f57a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7297, "upload_time": "2017-09-04T02:02:48", "url": "https://files.pythonhosted.org/packages/c9/e2/f399c6024bc1e87f767ff8e5b5715690b4c63a48b7a83bb4d75bd4170768/declxml-0.9.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0134cd2083b6253fc8cd4571ec771f29", "sha256": "1af6cdb03f70cb1bb71be953fecc1a6ec1072b09b9074536d1366dfdd670eca5" }, "downloads": -1, "filename": "declxml-0.9.1.tar.gz", "has_sig": false, "md5_digest": "0134cd2083b6253fc8cd4571ec771f29", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6084, "upload_time": "2017-09-04T02:02:49", "url": "https://files.pythonhosted.org/packages/4b/c0/aab405b9e1f15904274961be565bf9c6cbc0a5c688952ad8c2f9490a3acd/declxml-0.9.1.tar.gz" } ], "0.9.2": [ { "comment_text": "", "digests": { "md5": "94d72ea4f897efb37045a233004b126c", "sha256": "36cedf5d8b90f59f8d3b1e4924c23753cac6b0a008ff0ab8e59c85de7a9fe376" }, "downloads": -1, "filename": "declxml-0.9.2-py2-none-any.whl", "has_sig": false, "md5_digest": "94d72ea4f897efb37045a233004b126c", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 7854, "upload_time": "2017-11-07T03:20:04", "url": "https://files.pythonhosted.org/packages/25/1e/18e06174a586dea0f175383aa2cbaaa1ef850f2dedc718604a0fbd43ea76/declxml-0.9.2-py2-none-any.whl" } ], "1.0": [ { "comment_text": "", "digests": { "md5": "cfe3a04dc1749c82b509d83f808597c7", "sha256": "2b1e532258cff8beabec820271895aa0f476e423062c21ad48bade73f667522e" }, "downloads": -1, "filename": "declxml-1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "cfe3a04dc1749c82b509d83f808597c7", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 9521, "upload_time": "2018-06-05T02:00:16", "url": "https://files.pythonhosted.org/packages/c1/38/283564a26d6ef4d47022529a761f1ce6002ef4a35802fe1f5ccc1e98f725/declxml-1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1e0715a2323c2d6debc017eddceb8927", "sha256": "703e1bc08f9f6bfc56a566a9e203d172afd1c091508f812d6c7bf0ced8e4e15f" }, "downloads": -1, "filename": "declxml-1.0.tar.gz", "has_sig": false, "md5_digest": "1e0715a2323c2d6debc017eddceb8927", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9647, "upload_time": "2018-06-05T02:00:17", "url": "https://files.pythonhosted.org/packages/77/fd/ad68794175213790cd6b656869eb39ce4ed312e68177a057d3c20495a3e7/declxml-1.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "0bb53b5721890ed3c8bb92fbf201f095", "sha256": "912cacaf5eb86ddcf2df3bf817a81c57d5a98d83364469fc4a0128be065be062" }, "downloads": -1, "filename": "declxml-1.0.1.tar.gz", "has_sig": false, "md5_digest": "0bb53b5721890ed3c8bb92fbf201f095", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11312, "upload_time": "2018-06-07T00:50:03", "url": "https://files.pythonhosted.org/packages/13/65/88dfd2c55bba9a4a4537c7e2b42e4ed2406fb128fe560788d23c827e1a9b/declxml-1.0.1.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "c598c64c18b433b86e144c9ed6b487ec", "sha256": "67dd38b0eaf1de316f72e9886bfce004a68a588f34835154b6bec38c644eeaf0" }, "downloads": -1, "filename": "declxml-1.1.0.tar.gz", "has_sig": false, "md5_digest": "c598c64c18b433b86e144c9ed6b487ec", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13157, "upload_time": "2018-06-26T03:00:18", "url": "https://files.pythonhosted.org/packages/41/3b/286b5759b20e20e333415597bed166f2bfcd4b18bf775e0b7b0ffc916ec9/declxml-1.1.0.tar.gz" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "5deac5d6a38deae33ea6505ecf792042", "sha256": "26c803e6044db438a3d31d6b6c646df43b6d348e18e9d10ad6467ae30bd6c57f" }, "downloads": -1, "filename": "declxml-1.1.1.tar.gz", "has_sig": false, "md5_digest": "5deac5d6a38deae33ea6505ecf792042", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13208, "upload_time": "2018-09-03T19:09:20", "url": "https://files.pythonhosted.org/packages/33/df/1daf4502d9f81bc8a5ff19dcc502b7cde61c5ea60e751d6009e3999d079c/declxml-1.1.1.tar.gz" } ], "1.1.2": [ { "comment_text": "", "digests": { "md5": "6f52e72d2e0503430b66bc83480e7efe", "sha256": "4a1eee154e8c6a19ac4e0ac60eb7e25071856f9e2c788772a4f91f95a6e5883f" }, "downloads": -1, "filename": "declxml-1.1.2.tar.gz", "has_sig": false, "md5_digest": "6f52e72d2e0503430b66bc83480e7efe", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12656, "upload_time": "2019-01-06T21:06:02", "url": "https://files.pythonhosted.org/packages/1e/75/fe3dd3c6e9a3d363cc3a859bf54dfac0c3fd702b203645a00da39cb19103/declxml-1.1.2.tar.gz" } ], "1.1.2rc1": [ { "comment_text": "", "digests": { "md5": "01e185c1a8083f3592b01dd42382b154", "sha256": "77c930138498451e7d2121ade523b0837d76601bdc829b40416d489d4261191d" }, "downloads": -1, "filename": "declxml-1.1.2rc1.tar.gz", "has_sig": false, "md5_digest": "01e185c1a8083f3592b01dd42382b154", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11610, "upload_time": "2018-09-23T15:27:35", "url": "https://files.pythonhosted.org/packages/53/16/8759465380a22a13cd509a0d1887d0bb6d60a13c4aba190ab515db858705/declxml-1.1.2rc1.tar.gz" } ], "1.1.2rc3": [ { "comment_text": "", "digests": { "md5": "7cd7ea385e97530fa05a549732d60d89", "sha256": "23e0825c300a265a47805f1487817eff9bc5ab01181983687f5d4e658880d24c" }, "downloads": -1, "filename": "declxml-1.1.2rc3.tar.gz", "has_sig": false, "md5_digest": "7cd7ea385e97530fa05a549732d60d89", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12598, "upload_time": "2018-09-24T02:19:23", "url": "https://files.pythonhosted.org/packages/22/14/a6ca6d8ebefae55f24995d89c2dada9c83919dba4d03717771cd5ba4ffc5/declxml-1.1.2rc3.tar.gz" } ], "1.1.2rc4": [ { "comment_text": "", "digests": { "md5": "162c5acaf4ac2cddb6afe817e0d871a5", "sha256": "322199cbe6d3159f0ae89f44e4ad484f5bdfaa79591d53a26270bc01435fa9f1" }, "downloads": -1, "filename": "declxml-1.1.2rc4.tar.gz", "has_sig": false, "md5_digest": "162c5acaf4ac2cddb6afe817e0d871a5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12670, "upload_time": "2019-01-06T20:48:33", "url": "https://files.pythonhosted.org/packages/db/43/0d7758d63470dee8ddefd7f7a33cd1da464f519b3e51acfb8e720e49293d/declxml-1.1.2rc4.tar.gz" } ], "1.1.3": [ { "comment_text": "", "digests": { "md5": "e43e402f652302451448e9dc68f92d25", "sha256": "19b78c1ac9698cd836b18426aaa093ccb35cda4c7a0285021fe8ba6396063f20" }, "downloads": -1, "filename": "declxml-1.1.3.tar.gz", "has_sig": false, "md5_digest": "e43e402f652302451448e9dc68f92d25", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12694, "upload_time": "2019-02-03T22:46:38", "url": "https://files.pythonhosted.org/packages/6c/2a/51d5fcd89783b06e40a4dba7ec1f4002eb6df21a6e5763610328c1efc10f/declxml-1.1.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "e43e402f652302451448e9dc68f92d25", "sha256": "19b78c1ac9698cd836b18426aaa093ccb35cda4c7a0285021fe8ba6396063f20" }, "downloads": -1, "filename": "declxml-1.1.3.tar.gz", "has_sig": false, "md5_digest": "e43e402f652302451448e9dc68f92d25", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12694, "upload_time": "2019-02-03T22:46:38", "url": "https://files.pythonhosted.org/packages/6c/2a/51d5fcd89783b06e40a4dba7ec1f4002eb6df21a6e5763610328c1efc10f/declxml-1.1.3.tar.gz" } ] }