XML pickle
castironpi at gmail.com
castironpi at gmail.com
Mon Feb 18 20:50:18 EST 2008
> from lxml import etree
>
> class XMLable:
> cname= ''
> Text= object()
> class CTor:
> def __init__( self, *ar ):
> self.ar, self.kwar= ar, dict( ar )
> ctor= CTor()
> FTor= dict
> ftor= {}
> def __init__( self, par= None, *ar, **kwar ):
> nsmap= kwar.pop( 'nsmap', None )
> if par is None:
> self.node= etree.Element( self.cname or self.__class__.__name__,
> nsmap= nsmap )
> else:
> self.node= etree.SubElement( par.node, self.cname or
> self.__class__.__name__, nsmap= nsmap )
> for a, ca in zip( ar, self.ctor.ar ):
> if ca[0] in self.ftor:
> a= self.ftor[ ca[0] ]( a )
> if ca[1] is XMLable.Text:
> self.node.text= a
> else:
> self.node.set( ca[1], a )
> for k, v in kwar.items():
> if k in self.ftor:
> v= self.ftor[ k ]( v )
> if self.ctor.kwar[ k ] is XMLable.Text:
> self.node.text= v
> else:
> self.node.set( self.ctor.kwar[ k ], str( v ) )
>
> SS= '{urn:schemas-microsoft-com:office:spreadsheet}'
> X= '{urn:schemas-microsoft-com:office:excel}'
>
> class Workbook( XMLable ):
> #jtor= JTor( 'xmlns', req= 'urn:schemas-microsoft-
> com:office:spreadsheet' )
> def __init__( self ):
> nns= { 'x': 'urn:schemas-microsoft-com:office:excel',
> 'ss': 'urn:schemas-microsoft-com:office:spreadsheet' }
> XMLable.__init__( self, nsmap= nns )
> self.node.set( 'xmlns', 'urn:schemas-microsoft-
> com:office:spreadsheet' )
> self.styles= Styles( self )
> class Worksheet( XMLable ):
> ctor= XMLable.CTor( ( 'name', SS+ 'Name' ) )
> class Table( XMLable ): pass
> class Row( XMLable ):
> ctor= XMLable.CTor( ( 'index', SS+ 'Index' ) )
> class Cell( XMLable ):
> ctor= XMLable.CTor( ( 'index', SS+ 'Index' ), ( 'style', SS+
> 'StyleID' ) )
> ftor= XMLable.FTor( { 'style': lambda x: x.styleid } )
> class Data( XMLable ):
> ctor= XMLable.CTor( ( 'type', SS+ 'Type' ), ( 'data',
> XMLable.Text ) )
> class Styles( XMLable ): pass
> class Font( XMLable ):
> #jtor= JTor( 'family', X+ 'Family', req='Swiss' ), Jtor( 'bold', SS+
> 'Bold', lambda x: str( int( x ) ) )
> ctor= XMLable.CTor( ( 'family', X+ 'Family' ), ( 'bold', SS+
> 'Bold' ) )
> ftor= XMLable.FTor( { 'bold': lambda x: str( int( x ) ) } )
> class Style( XMLable ):
> styles= {}
> ctor= XMLable.CTor( ( 'styleid', SS+ 'ID' ) )
> def __init__( self, par= None, *ar, **kwar ):
> self.styleid= 's%i'% ( 21+ len( Style.styles ) )
> Style.styles[ self.styleid ]= self
> XMLable.__init__( self, par.styles, self.styleid )
> Font( self, *ar, **kwar )
>
> book= Workbook()
> sheet= Worksheet( book, 'WSheet1' )
> table= Table( sheet )
> row= Row( table, index= '2' )
> style= Style( book, 'Swiss', True )
> celli= Cell( row, style= style )
> datai= Data( celli, 'Number', '123' )
> cellj= Cell( row, index= 3 )
> dataj= Data( cellj, 'String', 'abc' )
>
> out= etree.tostring( book.node, pretty_print= True,
> xml_declaration=True )
> print( out )
> open( 'xl.xml', 'w' ).write( out )
> new= etree.XML( out )
> etree.XML( etree.tostring( book.node ) )
> out= etree.tostring( new, pretty_print= True, xml_declaration=True )
> print( out )
This is one way of eliminating a particular redundancy that showed up
in the first implementation. I've already excluded some potential
uses of XMLable. I've, in other words, made assumptions.
More information about the Python-list
mailing list