xml绑定的python体系结构

paxb的Python项目详细描述


Build statusLicenseSupported Python versionsCode coverage

用于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"}

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java的单元测试测试用例库。util。列出实现   java通过超类进行序列化/反序列化   java Android获取设备语言ISO字符串   java如何打开广告的行动。移动   Eclipse IDE for(嵌入式C/C++)开发者202012:经典的深色主题深黑色背景和菜单中的文本   java使用不同的内容动态创建TableView(JavaFX)   java JAXB将多个同名节点解组   java ClassDefNotFoundException,即使类由类加载器加载(服务器上安装了多个应用程序)   java有没有办法关闭在后端生成的MqttClient线程?   html如何在网站上的java小程序中包含图像?   java无法访问已分配给超类引用的子类实例变量   java在TableViewer中双击打开对话框   列出如何创建ListNode。JAVA   java如何从文本中输出的数组中放入随机图像