In my last posts: "pyxser, a work in progress", "pyxser, serializing collections" and "pyxser, a work in progress". I’ve signing that I have finished my python-object to XML serializer. Today I’ve redesigned the serialized, but preserving the O(n) serialization algorithm. Now, I have more strict way to create the XML documents. I’ve created a small XML DTD as follows:
<!ENTITY % pyxser.version "-//coder.cl//DTD pyxser 1.0//EN" > <!ENTITY % pyxser.ns "xmlns:pyxs" > <!ENTITY % pyxser.element.object "pyxs:object" > <!ENTITY % pyxser.element.item "pyxs:item" > <!ENTITY % pyxser.element.collection "pyxs:collection" > <!ENTITY % pyxser.attr.name "name" > <!ENTITY % pyxser.attr.type "type" > <!ENTITY % pyxser.attr.module "module" > <!ENTITY % pyxser.attr.size "size" > <!ENTITY % pyxser.attr.version "version" > <!ENTITY % pyxser.attr.id "id" > <!ENTITY % pyxser.attr.reference "reference" > <!ENTITY % pyxser.attr.key "key" > <!ELEMENT %pyxser.element.object; (%pyxser.element.item; | %pyxser.element.collection; | %pyxser.element.object;)* > <!ATTLIST %pyxser.element.object; %pyxser.ns; CDATA #FIXED "http://coder.cl/pyxser/model/" %pyxser.attr.id; ID #IMPLIED %pyxser.attr.reference; IDREF #IMPLIED %pyxser.attr.type; CDATA #IMPLIED %pyxser.attr.name; CDATA #IMPLIED %pyxser.attr.version; CDATA #IMPLIED %pyxser.attr.module; CDATA #IMPLIED %pyxser.attr.size; CDATA #IMPLIED %pyxser.attr.key; CDATA #IMPLIED > <!ELEMENT %pyxser.element.collection; (%pyxser.element.object; | %pyxser.element.item;)* > <!ATTLIST %pyxser.element.collection; %pyxser.attr.type; CDATA #REQUIRED %pyxser.attr.name; CDATA #REQUIRED > <!ELEMENT %pyxser.element.item; (#PCDATA) > <!ATTLIST %pyxser.element.item; %pyxser.attr.type; CDATA #REQUIRED %pyxser.attr.name; CDATA #REQUIRED %pyxser.attr.size; CDATA #IMPLIED %pyxser.attr.key; CDATA #IMPLIED >
And now, the python-object serialization have the next result, as seen in my last post, we have single object to serialize:
#!/usr/bin/env python # -*- coding: utf-8 -*- import pyxser import testpkg.sample class TestAnotherObject: first_element = "123" second_element = "456" if __name__ == "__main__": another = TestAnotherObject() another.first_element = "123" another.second_element = "456" test = testpkg.sample.ParentObject("hola", "chao", 2354345L) test.child("hi", 4.5, 2354) test.nested("holahola", 345, "hola") test.subnested(test) test.dyn_prop1 = ['holá', 'chaó', test, another] test.dyn_prop2 = ('hol`', test, 'sïn', 'trip') test.dyn_prop3 = {'saludo1': 'hòlá', 'saludo2': 'chäó', 'saludo3': test, 'saludo4': 'goodbye'} test.dyn_prop4 = u'sómé tèxtè ïñ Unicodè' test.dyn_prop5 = u'Añother Texé Iñ ÜnìcóDËc' print pyxser.serialize_xml(test)
The resulting XML now conforms the XML DTD defined for serialized python-objects and isn’t a tag salad as many XML that we can see on closed source software.
<?xml version="1.0" encoding="utf-8"?> <pyxs:object xmlns:pyxs="http://coder.cl/pyxser/model/" version="1.0" type="ParentObject" module="testpkg.sample" id="id-136624428"> <pyxs:item type="unicode" name="dyn_prop4" size="21">sxf3mxe9 txe8xtxe8 xefxf1 Unicodxe8</pyxs:item> <pyxs:item type="unicode" name="dyn_prop5" size="24">Axf1other Texxe9 Ixf1 xdcnxeccxf3Dxcbc</pyxs:item> <pyxs:collection type="list" name="dyn_prop1"> <pyxs:item type="unicode" name="item" size="4">holxe1</pyxs:item> <pyxs:item type="unicode" name="item" size="4">chaxf3</pyxs:item> <pyxs:object type="ParentObject" reference="id-136624428"/> <pyxs:object type="TestAnotherObject" module="__main__" id="id-136625228"> <pyxs:item type="str" name="first_element">123</pyxs:item> <pyxs:item type="str" name="second_element">456</pyxs:item> </pyxs:object> </pyxs:collection> <pyxs:collection type="tuple" name="dyn_prop2"> <pyxs:item type="unicode" name="item" size="4">hol`</pyxs:item> <pyxs:object type="ParentObject" reference="id-136624428"/> <pyxs:item type="unicode" name="item" size="3">sxefn</pyxs:item> <pyxs:item type="str" name="item">trip</pyxs:item> </pyxs:collection> <pyxs:object type="dict" name="dyn_prop3"> <pyxs:item type="unicode" name="item" size="4" key="saludo1">hxf3lxe0</pyxs:item> <pyxs:object reference="id-136624428" key="saludo3"/> <pyxs:item type="unicode" name="item" size="4" key="saludo2">chxe4xf3</pyxs:item> <pyxs:item type="str" name="item" key="saludo4">goodbye</pyxs:item> </pyxs:object> <pyxs:object type="ChildObject" name="parent3" module="testpkg.sample" id="id-136625260"> <pyxs:item type="str" name="child1">hi</pyxs:item> <pyxs:item type="float" name="child2">4.5</pyxs:item> <pyxs:item type="int" name="child3">2354</pyxs:item> <pyxs:object type="NestedChild" name="child4" module="testpkg.sample" id="id-136625292"> <pyxs:object type="SubNestedChild" name="nested4" module="testpkg.sample" id="id-136625356"> <pyxs:object type="ParentObject" name="subnested1" module="testpkg.sample" reference="id-136624428"/> </pyxs:object> <pyxs:item type="str" name="nested1">holahola</pyxs:item> <pyxs:item type="int" name="nested2">345</pyxs:item> <pyxs:item type="str" name="nested3">hola</pyxs:item> </pyxs:object> </pyxs:object> <pyxs:item type="str" name="parent2">chao</pyxs:item> <pyxs:item type="str" name="parent1">hola</pyxs:item> </pyxs:object>
And using a single XML validator, without a tag soup or tag salad that many closed source software have on many companies that I’ve seen — as the Micro$oft web.config and app.config files when you add some custom extensions — and we have the needed strictness to create the proper XML Schema arround our serializer.
[XXX@quake /work/XXX/c/pyxser]$ xmllint --noout --dtdvalid ./src/pyxser.dtd test.xml [XXX@quake /work/XXX/c/pyxser]$
I know that XML DTD isn’t a great job, but have some sense on validating the document. I need to create the proper DTD and the proper XML Schema, and I know that I have a good base on that ;)
[OT] WTF!?!?!, my site looks really ugly under IE7, but I can see the proper rendering under knoqueror, firefox, safari and opera. Who’s wrong? xD, I think that IE7 sucks ;)
Well, I was thinking that a w3c valid css was enough to supply the ugly hacks that IE browsers family needs, but I’m wrong. Internet Explorer, aka IE* really sucks, it’s another headache yo my free time.
[...] user, you may know that it uses a standard and structured serialization model. It was designed on January of 2009, and his target from that date until today is to generate a universal serialization model, so it [...]