Package: declxml
declxml - Declarative XML ProcessingXML 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.InstallationInstall using either pippipinstalldeclxmlorPipenvpipenvinstalldeclxmlDocumentationFor detailed documentation, see the project'sdocumentation page.UsageGiven some XML to process<author><name>RobertA.Heinlein</name><birth-year>1907</birth-year><book><title>StarshipTroopers</title><published>1959</published></book><book><title>StrangerinaStrangeLand</title><published>1961</published></book></author>Create a declxml processor that defines the structure of the document>>>importdeclxmlasxml>>>author_processor=xml.dictionary('author',[...xml.string('name'),...xml.integer('birth-year'),...xml.array(xml.dictionary('book',[...xml.string('title'),...xml.integer('published')...]),alias='books')...])Then use that processor to parse the XML data>>>frompprintimportpprint>>>author_xml="""... <author>...     <name>Robert A. Heinlein</name>...     <birth-year>1907</birth-year>...     <book>...         <title>Starship Troopers</title>...         <published>1959</published>...     </book>...     <book>...         <title>Stranger in a Strange Land</title>...         <published>1961</published>...     </book>... </author>... """>>>pprint(xml.parse_from_string(author_processor,author_xml)){'birth-year':1907,'books':[{'published':1959,'title':'Starship Troopers'},{'published':1961,'title':'Stranger in a Strange Land'}],'name':'Robert A. Heinlein'}The same processor can also be used to serialize data to XML>>>author={...'birth-year':1920,...'name':'Issac Asimov',...'books':[...{...'title':'I, Robot',...'published':1950...},...{...'title':'Foundation',...'published':1951...}...]...}>>>print(xml.serialize_to_string(author_processor,author,indent='    '))<?xmlversion="1.0"encoding="utf-8"?><author><name>IssacAsimov</name><birth-year>1920</birth-year><book><title>I,Robot</title><published>1950</published></book><book><title>Foundation</title><published>1951</published></book></author>Want to work with objects instead of dictionaries? You can do that with declxml too>>>classAuthor:......def__init__(self):...self.name=None...self.birth_year=None...self.books=[]......def__repr__(self):...return'Author(name=\'{}\', birth_year={}, books={})'.format(...self.name,self.birth_year,self.books)>>>classBook:......def__init__(self):...self.title=None...self.published=None......def__repr__(self):...return'Book(title=\'{}\', published={})'.format(self.title,self.published)...>>>author_processor=xml.user_object('author',Author,[...xml.string('name'),...xml.integer('birth-year',alias='birth_year'),...xml.array(xml.user_object('book',Book,[...xml.string('title'),...xml.integer('published')...]),alias='books')...])>>>xml.parse_from_string(author_processor,author_xml)Author(name='Robert A. Heinlein',birth_year=1907,books=[Book(title='Starship Troopers',published=1959),Book(title='Stranger in a Strange Land',published=1961)])What about namedtuples, you say? Those are extremely useful, and declxml lets you work with them as well>>>fromcollectionsimportnamedtuple>>>Author=namedtuple('Author',['name','birth_year','books'])>>>Book=namedtuple('Book',['title','published'])>>>author_processor=xml.named_tuple('author',Author,[...xml.string('name'),...xml.integer('birth-year',alias='birth_year'),...xml.array(xml.named_tuple('book',Book,[...xml.string('title'),...xml.integer('published')...]),alias='books')...])>>>xml.parse_from_string(author_processor,author_xml)Author(name='Robert A. Heinlein',birth_year=1907,books=[Book(title='Starship Troopers',published=1959),Book(title='Stranger in a Strange Land',published=1961)])