简单且可扩展的xml python marshaller

pysxm的Python项目详细描述


https://travis-ci.org/josuebrunel/pysxm.svg?branch=masterhttps://coveralls.io/repos/github/josuebrunel/pysxm/badge.svg?branch=masterhttp://pepy.tech/badge/pysxm

pysxm是一个简单且可扩展的xml python编组器。 它有两种简单和基本的类型:

  • 简单类型
  • complexType

它支持py2和py3,并在hood下使用lxml.objectify

安装

pipinstallpysxm

快速启动

In[1]:frompysxmimportComplexTypeIn[2]:classPerson(ComplexType):...:attrib={'description':'a random person'}...:def__init__(self,fname,lname):...:self.fname=fname...:self.lname=lname...:In[3]:person=Person('token','black')In[4]:print(person)<personxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"description="a random person"><lname>black</lname><fname>token</fname></person>

比方说,我们希望对象有一个不同的tag。 属性标记名标记名可以设置为定义对象的xml标记名

In[5]:classPerson(ComplexType):...:attrib={'description':'a random person'}...:tagname='student'...:def__init__(self,fname,lname):...:self.fname=fname...:self.lname=lname...:In[6]:person=Person('token','black')In[7]:print(person)<studentxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"description="a random person"><lname>black</lname><fname>token</fname></student>

可以设置sequencesequence(元组或列表)属性来决定XML中子元素的orderpresence

In[8]:classPerson(ComplexType):...:attrib={'description':'a random person'}...:tagname='student'...:_sequence=('city','fname')...:...:def__init__(self,fname,lname,city):...:self.fname=fname...:self.lname=lname...:self.city=city...:In[9]:person=Person('token','black','south park')In[10]:print(person)<studentxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"description="a random person"><city>southpark</city><fname>token</fname></student>

让我们向对象添加一个命名空间

In[11]:classPerson(ComplexType):...:attrib={'description':'a random south park character'}...:nsmap={'sp':'http://southpark/xml/'}...:...:def__init__(self,fname,lname,city):...:self.fname=fname...:self.lname=lname...:self.city=city...:In[12]:person=Person('token','black','south park')In[13]:print(person)<sp:personxmlns:sp="http://southpark/xml/"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"description="a random south park character"><sp:lname>black</sp:lname><sp:city>southpark</sp:city><sp:fname>token</sp:fname></sp:person>

让我们确保person的组是coongoth。 为此,我们可以从simpleType对象继承并通过重写check_restriction(self,value)方法定义一个限制。

In[7]:frompysxmimportComplexType,SimpleTypeIn[8]:classGroup(SimpleType):...:allowed_groups=('coon','goth')...:defcheck_restriction(self,value):...:ifvaluenotinself.allowed_groups:...:raiseValueError('<%s> value %s not in %s'%(self.tagname,value,self.allowed_groups))...:In[9]:classPerson(ComplexType):...:def__init__(self,fname,lname,group):...:self.fname=fname...:self.lname=lname...:self.group=Group(group)...:In[10]:Person('token','black','boys')...<ipython-input-8-116b49042116>incheck_restriction(self,value)3defcheck_restriction(self,value):4ifvaluenotinself.allowed_groups:---->5raiseValueError('<%s> value %s not in %s'%(self.tagname,value,self.allowed_groups))6ValueError:<group>valueboysnotin('coon','goth')In[11]:print(Person('token','black','goth'))<personxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><lname>black</lname><group>goth</group><fname>token</fname></person>

notecomplexType可以将complexTypesimpleType作为属性

frompysxmimportComplexType,SimpleTypeclassAdultAge(SimpleType):tagname='age'attrib={'minvalue':'18','maxvalue':'100'}defcheck_restriction(self,value):ifint(value)<18:raiseValueError("<%s> '%d' < 18"%(self.tagname,value))classCredentials(ComplexType):def__init__(self,login,password):self.login=loginself.password=passwordclassPerson(ComplexType):def__init__(self,fname,lname,credentials,age):self.fname=fnameself.lname=lnameself.credentials=Credentials(credentials['login'],credentials['password'])self.age=AdultAge(age)In[3]:data={...:'fname':'token','lname':'black',...:'credentials':{'login':'t0ken','password':'l33tolite'},...:'age':'30'}In[4]:person=Person(**data)In[5]:print(person)<personxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><lname>black</lname><credentials><login>t0ken</login><password>l33tolite</password></credentials><agemaxvalue="100"minvalue="18">30</age><fname>token</fname></person>In[6]:person.save('token.xml')

使用save方法(object.save(<;filename>;))可以将XML结果保存到文件中。

In[7]:cattoken.xml<personxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><lname>black</lname><credentials><login>t0ken</login><password>l33tolite</password></credentials><agemaxvalue="100"minvalue="18">30</age><fname>token</fname></person>

外部模块

pysxm附带了两种扩展类型。这些类型在pysxm.ext模块中定义。

数据复杂类型

这是complexType的一个简单的dataClass。以下是如何设置:

frompysxm.extimportDataComplexType,XSimpleTypeclassGame(DataComplexType):platform=XSimpleType('platform',['xboxone','xboxx'],lambdav,av:vinav)>>>game=Game(name='state of decay 2',editor='undead labs',platform='xboxone')>>>print(game)<game><name>stateofdecay2</name><platform>xboxone</platform><editor>undeadlabs</editor></game>

xsimpletype

每当你想检查一个值的时候,给一个simpleType子类会很烦人。为了克服这个问题,pysxm提供了一个名为xsimpletype的descriptor描述符:

classXSimpleType(name=None,restriction=None,checker=None,error_msg=None,**kwargs)'''name: it's the name of the attribute.
    restriction: self explanatory
    checker: the fucntion that checks the input value
    error_msg: message returned when checking fails
    kwargs: as tagname, attrib or nsmap
    '''

下面是一个示例:

classXboxGamer(ComplexType):platform=XSimpleType('platform',('xone','xbox360','xbox'),lambdav,av:vinav)score=XSimpleType('score',(4000,1000000),lambdav,av:int(av[0])<=int(v)<int(av[1]))lastlogin=XDateTimeType('lastlogin')def__init__(self,gamertag,platform,score,lastlogin):self.gamertag=gamertagself.platform=platformself.score=scoreself.lastlogin=lastloginIn[1]:print(gamer_data){'gamertag':'LokingHD','platform':'ps4','score':'22526','lastlogin':'2018-03-21'}In[2]:XboxGamer(**gamer_data)---------------------------------------------------------------------------ValueErrorTraceback(mostrecentcalllast)<ipython-input-2-61f95466da46>in<module>()---->1XboxGamer(**gamer_data)/home/josue/workspace/dev/pysxdb/pysxm/ext.pycincheck(self,instance,value)77ifnotself.checker(value,self.restriction_values):78raiseValueError('tagname <%s> value %s is invalid: expected (%s)'--->79%(instance.tagname,value,self.restriction_values))8081defcheck_restriction(self,instance,value):ValueError:tagname<xboxgamer>valueps4isinvalid:expected(('xone','xbox360','xbox'))In[3]:gamer_data['platform']='xone'In[4]:gamer=XboxGamer(**gamer_data)In[5]:print(gamer)<xboxgamerxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><gamertag>LokingHD</gamertag><platform>xone</platform><score>22526</score><lastlogin>2018-03-21T00:00:00</lastlogin></xboxgamer>

pysxm.ext中定义的大多数类型都是描述符,它们是子类。

瞧:眨眼:

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

推荐PyPI第三方库


热门话题
java密钥安全如何确保密钥安全?   java Webelement屏幕截图错误   java Selenium:我正在使用Firefox版本46.01,并在显示的ECLIPSE错误消息中进行了测试   javascript Jquery自动完成不向java传递值   javajavax。坚持不懈persistenceexception eclipselink4002(eclipse持久性服务2.5.2.v 20140319   java检查大型HashMap是否包含键的最佳方法?   java如何解决连接mssql时的JNDI错误   modelandview内部重定向和重定向之间的java差异   swing如何处置未使用的JavaUI对象   java在数组中多次存储同一引用项,一次更改会影响所有引用项吗?   java项目Euler#14:为什么我的树形映射算法比暴力慢?   java如何使用不同的分隔符连接配置单元列   java在部署在不同服务器上的两个WAR之间共享pojo对象   Spring控制器中的java JSR303验证和获取@JsonProperty名称   java检查playstore是否安装了Android应用程序   java从一段字符串中选择一个单词?   当发生特定选择时显示组合框的java   大量调用后,构造函数中的JAVA数组复制速度异常缓慢   java无法使用KeyListner移动我的图像   使用Spring MVC和线程保存java实体