bbc.co.uk

Home
Contacts
 NMLParser - an XML - object serializer for python

This is the documentation for a Python implementation of a mapping between objects and XML.

The idea is that you can just write your python classes as you would anyway, e.g.:

class Network:    
    def __init__(self):
        self.states = {} 
        self.connections = []
    def addState(self, s):
        self.states[s.name]=s
    
class State:
    def __init__(self, n=None, c=0):
        self.name = n
        self.count = c
    
class Connection:
    def __init__(self, s1=None, s2=None, w=0.0):
        self.s1 = s1
        self.s2 = s2
        self.w = w

... and create an XML schema file (in our peculiar format), to give the generic parser some hints on types of things which are not available from within python space:

<Package name="test.network">
  <Class name="Network">
	<Field name="states" type="list" elementType="State" xmlstyle="hidefield"/>
	<Field name="connections" type="list" elementType="Connection" xmlstyle="hidefield"/>
  </Class>
    
  <Class name="State">
	<Field name="name" type="string"/>
	<Field name="count" type="int"/>
  </Class>

  <Class name="Connection">
	<Field name="s1" type="ref" elementType="State"/>
	<Field name="s2" type="ref" elementType="State"/>
	<Field name="w" type="double"/>
  </Class>
</Package>

... and that should be all the work you have to do. To convert object trees to/from XML, use:-

  • First read the schema:-
    netSchema = parseSchemaFile("test-net.sch")
    
  • Then you can write out an object as xml:-
    print serializeObject(net, netSchema)
    
  • ... and read in an XML file as an object using:-
    tree = parseXMLFile("test-net.xml", locals(), netSchema)
    

    ... Here is a sample XML file:-

    <Network>
        <Connection s1="s1" s2="s2" w="0.5"/>
        <Connection s1="s3" s2="s2" w="0.5"/>
        <Connection s1="s2" s2="s3" w="0.5"/>
        <Connection s1="s4" s2="s2" w="0.5"/>
        <State count="100" name="s3"/>
        <State count="100" name="s2"/>
        <State count="100" name="s1"/>
        <State count="100" name="s4"/>
    </Network>