Schema definition language
It is useful to have an XML specification of the object model -
corresponding to the class definitions - as it is independent
of a particular language, and can provide hints (such as types and
restrictions) which are not always accessible by reflection from a language.
There are many different schema languages (XML-Schema, RELAX-NG, RDFS, XMI)
but none of them is perfect for the task of defining object models. XML-Schema
defines both an object model, and its mapping to particular XML elements,
whereas we want just the object model definition. XMI, an XML encoding of
UML diagrams includes more than we need.
Because of this we created a new simple schema language in XML,
corresponding closely to class definitions in a programming language.
This schema language is defined using itself below:
<Package name="org.neuroml.schema">
<Class name="Package">
<Field name="name" type="string"/>
<Field name="desc" type="string"/>
<Field name="classes" type="list" elementType="Class" xmlstyle="hidefield"/>
</Class>
<Class name="Class">
<Field name="name" type="string"/>
<Field name="desc" type="string"/>
<Field name="extends" type="string"/>
<Field name="fields" type="list" elementType="Field" xmlstyle="hidefield"/>
<Field name="keyfield" type="string" default="name"/>
</Class>
<Class name="Field">
<Field name="name" type="string"/>
<Field name="type" type="enum" choice="int|string|double|boolean|url|list|ref|union|enum|any"/>
<Field name="elementType" type="string"/>
<Field name="choice" type="list" elementType="string" xmlstyle="compact"/>
<Field name="desc" type="string"/>
<Field name="default" type="string"/>
<Field name="xmlstyle" type="enum" choice="compact|hidefield|showfield"/>
</Class>
<Class name="PackageList">
<Field name="packages" type="list" elementType="Package" xmlstyle="hidefield"/>
</Class>
</Package>
and an example using it is given below
<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>
... corresponding to Java class definitions:
class Network {
List<State> states;
List<Connection> connections;
}
class State {
String name;
int count;
}
class Connection {
String s1;
String s2;
double w;
}
Package
A package has a name, a description and a list of class definitions.
Class
A class has a name, description, name of the class it extends, a list of fields, and
an optional keyfield which could be used for referencing.
<Class name="X">
<Field name="f1" type="int"/>
<Field name="f2" type="string"/>
<Field name="f3" type="object" elementType="Y"/>
<Field name="f4" type="object" elementType="Y"/>
<Field name="f5" type="list" elementType="Z"/>
<Field name="f6" type="ref" elementType="A"/>
</Class>
... corresponds to Java definition like:-
class X {
int f1;
String f2;
Y f3;
Y f4;
List<Z> f5;
Ref<A> f6;
}
Field
A field has a type and a name (e.g. "int", "x"). Simple types are: int, string, double, boolean, url.
List types and Reference types can specify an elementType. The xmlstyle attribute chooses whether lists
are:
Python notes
The GNOSIS page on
python and XML - describes xml_objectify, a python version which is elegant codewise but doesn't
produce very beautiful XML.
The process:
- (1) Write the class definitions in Python
- (2) Write a schema XML file
- (3) Call the built in methods in the kit to serialise / deserialise objects to/from memory.
Known issues
- The "ref" type (a serialisable reference to another object) is
currently just treated as a string - it's up to the code to
dereference strings.