xml绑定的python体系结构
paxb的Python项目详细描述
用于XML绑定的Python体系结构
paxb是一个库,它为xml文档和python对象之间的映射提供了api。
paxb库实现以下功能:
- 将XML文档反序列化为Python对象
- 验证反序列化数据
- 访问和更新python对象字段
- 将python对象序列化为xml文档
paxb提供了一种在xml文档和python对象之间进行映射的有效方法。使用paxb 开发人员可以编写较少强调应用程序业务逻辑的样板代码。
因为paxb基于attrs库paxb和attrs api可以混合在一起。
安装
您可以使用pip安装paxb:
$ pip install paxb
要求
文档
文档可在Read the Docs获得。
快速启动
假设您有一个xml文档user.xml:
<?xml version="1.0" encoding="utf-8"?><doc:envelopexmlns="http://www.test.org"xmlns:doc="http://www.test1.org"><doc:username="Alex"surname="Ivanov"age="26"><doc:birthdateyear="1992"month="06"day="14"/><doc:contacts><doc:phone>+79204563539</doc:phone><doc:email>alex@gmail.com</doc:email><doc:email>alex@mail.ru</doc:email></doc:contacts><doc:documents><doc:passportseries="3127"number="836815"/></doc:documents><data:occupationsxmlns:data="http://www.test2.org"><data:occupationtitle="yandex"><data:address>Moscow</data:address><data:employees>8854</data:employees></data:occupation><data:occupationtitle="skbkontur"><data:address>Yekaterinburg</data:address><data:employees>7742</data:employees></data:occupation></data:occupations></doc:user></doc:envelope>
要反序列化文档,可以使用XML Processing Modules python标准库api解析文档,然后设置相应的类字段。如此迫切 代码有很多样板操作。相反,您可以使用paxb api编写声明式代码。你们所有人 需要描述字段映射和类型,paxb将为您序列化和反序列化数据:
importjsonimportrefromdatetimeimportdateimportattrimportpaxbaspb@pb.model(name='occupation',ns='data',ns_map={'data':'http://www.test2.org'})classOccupation:title=pb.attr()address=pb.field()employees=pb.field(converter=int)@pb.model(name='user',ns='doc',ns_map={'doc':'http://www.test1.org'})classUser:name=pb.attr()surname=pb.attr()age=pb.attr(converter=int)birth_year=pb.wrap('birthdate',pb.attr('year',converter=int))birth_month=pb.wrap('birthdate',pb.attr('month',converter=int))birth_day=pb.wrap('birthdate',pb.attr('day',converter=int))@propertydefbirthdate(self):returndate(year=self.birth_year,month=self.birth_month,day=self.birth_day)@birthdate.setterdefbirthdate(self,value):self.birth_year=value.yearself.birth_month=value.monthself.birth_day=value.dayphone=pb.wrap('contacts',pb.field())emails=pb.wrap('contacts',pb.as_list(pb.field(name='email')))passport_series=pb.wrap('documents/passport',pb.attr('series'))passport_number=pb.wrap('documents/passport',pb.attr('number'))occupations=pb.wrap('occupations',pb.lst(pb.nested(Occupation)),ns='data',ns_map={'data':'http://www.test2.org'})citizenship=pb.field(default='RU')@phone.validatordefcheck(self,attribute,value):ifnotre.match(r'\+\d{11,13}',value):raiseValueError("phone number is incorrect")withopen('user.xml')asfile:xml=file.read()
然后可以修改反序列化对象并将其序列化回XML文档或转换为JSON格式:
try:user=pb.from_xml(User,xml,envelope='doc:envelope',ns_map={'doc':'http://www.test1.org'})user.birthdate=user.birthdate.replace(year=1993)withopen('user.json')asfile:json.dump(attr.asdict(user),file)except(pb.exc.DeserializationError,ValueError)ase:print(f"deserialization error: {e}")
user.json:
{"age":26,"birth_day":14,"birth_month":6,"birth_year":1993,"citizenship":"RU","emails":["alex@gmail.com","alex@mail.ru"],"name":"Alexey","occupations":[{"address":"Moscow","employees":8854,"title":"yandex"},{"address":"Yekaterinburg","employees":7742,"title":"skbkontur"}],"passport_number":"836815","passport_series":"3127","phone":"+79204563539","surname":"Ivanov"}