pyxser stands for python xml serialization and is a python object to XML serializer that validates every XML deserialization against the pyxser 1.0 DTD. It uses an O(n) algorithm for serializing objects to XML and an O(n) algorithm to deserialize XML and convert back to python objects. pyxser is written entirely in C as a python extension. The current stable release is pyxser-0.2r and supported Python version comes from 2.5 to 2.6.
getdtd(...)
This function returns the pyxser 1.0 DTD location in your system as
string.
getdtd_c14n(...)
This function returns the pyxser 1.0 DTD for C14N location in your
system as string.
serialize(...)
Uses the next keyword argumens:
obj -> python object to serialize
enc -> xml serialization encoding
depth -> node navigation depth
Gets any object defined in a Python module as class as argument
and serializes it as XML. The serialization model is based on the
pyxser DTD 1.0. Objects are serialized as pyxs:obj element, collections
are serialized as pyxs:col element (tuples, lists and dictionaries)
and properties are serialized as pyxs:prop elements.
The serialization algorithm is a O(n) one, this means which the
serializer runs over the object tree just one time and cross
refernces are serialized as XML references through the IDREF
attribute pyxs:ref.
The serialization model resides in the pyxser public identifier DTD:
<!DOCTYPE pyxs:obj
PUBLIC '-//coder.cl//DTD pyxser 1.0//EN'
'http://projects.coder.cl/pyxser/dtd/pyxser-1.0.dtd'>
Returns an Unicode Object
serialize_c14n(...)
Uses the next keyword argumens:
obj -> python object to serialize
depth -> node navigation depth
exc -> exclusive canonization
com -> with comments
Same as serialize(), but uses C14N canonization, to use exclusive
canonization the 'exc' argument must differ from zero and to use
comments 'com' must differ from zero. The encoding must be UTF-8
for canonization.
<!DOCTYPE pyxs:obj
PUBLIC '-//coder.cl//DTD pyxser C14N 1.0//EN'
'http://projects.coder.cl/pyxser/dtd/pyxser-1.0-c14n.dtd'>
* Information about Canonical XML at:
http://www.w3.org/TR/xml-c14n
* Information about Exclusive Canonical XML at
http://www.w3.org/TR/xml-exc-c14n
NOTE: The canonical DTD converts all ID, IDREF and NMTOKEN
attributes to CDATA attributes
Returns an Unicode Object
serialize_c14n_strict(...)
Uses the next keyword argumens:
obj -> python object to serialize
depth -> node navigation depth
exc -> exclusive canonization
com -> with comments
Same as serialize_c14n(), but uses C14N canonization in a strict
mode and rather than serializing NMTOKEN, ID, and IDREF attributes,
uses the C14N canon to execute the XML tree rendering. The encoding
must be UTF-8 for canonization.
<!DOCTYPE pyxs:obj
PUBLIC '-//coder.cl//DTD pyxser C14N 1.0//EN'
'http://projects.coder.cl/pyxser/dtd/pyxser-1.0.dtd'>
* Information about Canonical XML at:
http://www.w3.org/TR/xml-c14n
* Information about Exclusive Canonical XML at
http://www.w3.org/TR/xml-exc-c14n
NOTE: C14N serialized objects can not be deserialized because we
need the ID and IDREF attributes to suppor cross referenced
objects.
Returns an Unicode Object
unserialize(...)
Uses the next keyword argumens:
obj -> the serialized python object
enc -> xml serialization encoding
Takes an XML string as arguments to deserialize it and be converted
back to it's original Python object. The deserialization algorithm
supports automatic module loading, but searches for them in the module
dictionary first to reach the original object type. It needs that the
implied modules can be recheable by Python to get back the objects in
it's original form.
The deserialization algorithm is a O(n) one, this means that forward
references are not supported because the first ocurrence of any object
it's serialized once and then referenced, but not referenced and then
serilized.
Every serilized object is validated against the pyxser DTD 1.0
validate(...)
Uses the next keyword argumens:
obj -> the serialized python object
enc -> xml serialization encoding
Validates the XML input string against the pyxser DTD 1.0 in your
local filesystem.
validate_c14n(...)
Uses the next keyword argumens:
obj -> the serialized python object
enc -> xml serialization encoding
Validates the XML input string against the pyxser DTD 1.0 C14N in
your local filesystem.
xmlcleanup(...)
Calls the cleanup function for the libxml2 parser, be carefull
using this function, and try to use it when the parser really
isn't in use.
<?xml version="1.0" encoding="UTF-8"?>
<pyxs:obj xmlns:pyxs="http://projects.coder.cl/pyxser/model/" version="1.0" type="ParentObject" module="testpkg.sample" objid="id-136863532">
<pyxs:prop type="unicode" name="dyn_prop4" size="28">sómé tèxtè ïñ Unicodè</pyxs:prop>
<pyxs:prop type="unicode" name="dyn_prop5" size="31">Añother Texé Iñ ÜnìcóDËc</pyxs:prop>
<pyxs:prop type="float" name="dyn_prop6">1.5</pyxs:prop>
<pyxs:prop type="int" name="dyn_prop7">1000</pyxs:prop>
<pyxs:col type="list" name="dyn_prop1">
<pyxs:prop type="unicode" size="5">holá</pyxs:prop>
<pyxs:prop type="unicode" size="5">chaó</pyxs:prop>
<pyxs:obj type="TestAnotherObject" module="testpkg.sample" objid="id-136773868">
<pyxs:prop type="int" name="first_element">123</pyxs:prop>
<pyxs:obj module="testpkg.sample" type="TestAnotherObject" name="dyn_prop1" objid="id-136863372">
<pyxs:prop type="str" name="first_element">xyz</pyxs:prop>
<pyxs:prop type="complex" name="second_element">7.810000:2.010000</pyxs:prop>
</pyxs:obj>
<pyxs:prop type="int" name="second_element">456</pyxs:prop>
</pyxs:obj>
</pyxs:col>
<pyxs:col type="tuple" name="dyn_prop2">
<pyxs:prop type="unicode" size="4">hol`</pyxs:prop>
<pyxs:prop type="unicode" size="4">sïn</pyxs:prop>
<pyxs:prop type="str">trip</pyxs:prop>
<pyxs:obj type="TestAnotherObject" module="testpkg.sample" objid="id-136863404">
<pyxs:prop type="complex" name="first_element">5.820000:3.990000</pyxs:prop>
<pyxs:prop type="str" name="second_element">cdf</pyxs:prop>
</pyxs:obj>
</pyxs:col>
<pyxs:col type="dict" name="dyn_prop3">
<pyxs:prop type="unicode" name="saludo1" size="6">hólà</pyxs:prop>
<pyxs:prop type="unicode" name="saludo2" size="6">chäó</pyxs:prop>
<pyxs:obj type="TestAnotherObject" name="saludo5" module="testpkg.sample" objid="id-136863500">
<pyxs:prop type="str" name="first_element">XXX</pyxs:prop>
<pyxs:prop type="complex" name="second_element">32.100000:33.100000</pyxs:prop>
</pyxs:obj>
<pyxs:prop type="str" name="saludo4">goodbye</pyxs:prop>
</pyxs:col>
<pyxs:obj module="testpkg.sample" type="ChildObject" name="parent3" objid="id-136863660">
<pyxs:prop type="str" name="child1">hi</pyxs:prop>
<pyxs:prop type="float" name="child2">4.5</pyxs:prop>
<pyxs:prop type="int" name="child3">2354</pyxs:prop>
<pyxs:obj module="testpkg.sample" type="NestedChild" name="child4" objid="id-136863692">
<pyxs:obj module="testpkg.sample" type="SubNestedChild" name="nested4" objid="id-136863724">
<pyxs:obj module="testpkg.sample" type="TestAnotherObject" name="subnested1" objref="id-136863404"/>
</pyxs:obj>
<pyxs:prop type="str" name="nested1">holahola</pyxs:prop>
<pyxs:prop type="int" name="nested2">345</pyxs:prop>
<pyxs:prop type="str" name="nested3">hola</pyxs:prop>
</pyxs:obj>
</pyxs:obj>
<pyxs:prop type="str" name="parent2">chao</pyxs:prop>
<pyxs:prop type="str" name="parent1">hola</pyxs:prop>
</pyxs:obj>
The pyxser licence is GNU Lesser General Public License version 3. You can use in your closed source application, but if you modify pyxser, you must publish the changes.