简单且可扩展的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无法启动应用程序:JNLP错误   java根据用户输入在PreparedStatement中使用setTime()或setNull()   java EJB与同步   java以object为键通过hashmap进行搜索   java中的模10^9+7   针对包含其他对象的对象的java OOP最佳实践   如何将字符串作为HTML代码从Java文件读取到JSP页面?   java我的POM怎么了?“解析表达式..检测到递归表达式循环”   用于Hbase的Mapreduce的java NoSuchMethodError   JAVAlang.SecurityException:权限拒绝:启动意图{act=安卓.Intent.action.MAIN cat=[安卓.Intent.category.LAUNCHER]   数组初始化谜语Java   通过arraylist搜索时的java句柄关联