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 swing表单配置文件中显示动态布局   swing Java使用GridLayout和鼠标交互式JPanel创建JFrame   java使用jsp dao和servlet从数据库中的4行中只插入几行   java SqlLite:我们可以选择行作为列吗?   启动glassfish服务器时java获取错误   PersistenceUnit的java部署[…]失败。关闭此PersistenceUnit的所有工厂   java将具有多个关系的实体与集合中的任何元素进行匹配   java对命名模式的建议,该模式在op失败时尝试强制转换返回null   使用jtwitter的java安卓抛出错误   使用Java方法查找数组中最小int的位置   SwingJava。网络气球提示没有出现   java无法使用JavaMail api发送邮件   java HashSet contains()为自定义对象返回false。hashCode()和equals()似乎实现正确   Java:在运行时和编译时向类中添加字段?   java正在服务类中导入jersey和JAXR,这被认为是错误的做法