Schemata programmatisch hinzufügen

onion.net ist dazu konzipiert, Schemata zur Laufzeit modifizieren zu können. Ihnen stehen zusätzlich Werkzeuge zur transaktionellen Veränderung mehrerer Schemata, sowie der Massendatenmanipulation per XSLT zur Verfügung. Wie im onion.net Editor ist es auch hier nicht möglich, eine Veränderung eines Schemas durchzuführen, die den Bestandsdaten in irgendeiner Form widerspricht.

onion.net bietet zusätzlich zum inhaltlichen Schema ein strukturelles Schema. Dieses besagt, dass unterhalb eines Datenobjektes nur Datenobjekte bestimmter Datentypen zulässig sind. Auch die Modifikation des strukturellen Schemas wird stets gegen die Bestandsdaten geprüft.

Im folgenden Beispiel wird ein abstraktes Wurzelschema, ein Containerschema und ein Schema für Beispieldaten erstellt. Das Wurzel- und Containerschema dient der Vorbeugung von Unordnung in Ihrem System. Das Wurzelschema gruppiert alle Schemata, die einem Zweck zugeordnet sind. In unserem Fall stellt sie zusätzlich einen simplen Datentyp zur Wiederverwendung zur Verfügung. Das Containerschema soll die strukturelle Wurzel aller Daten bilden, die einem Zweck zugeordnet sind.

using System;
using Onion.Client;

class Program
{
  private static void Main(string[] args)
  {
    using (var session = new OnionSession("ipc://onion.net/onion/server", "admin", "admin"))
    {
      // fetch some necessary system schemata
      ISchema rootSchema = session.Schemata["http://onionworks.net/2004/schema/systemroot"];
      ISchema userdefined = session.Schemata["http://onionworks.net/2004/schema/userdefined"];

      // create an abstract root schema for our test types including a simple type
      ISchema exampleRootType = userdefined.Children.Create(
        @"<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema"" 
                     xmlns:onion=""http://onionworks.net/2004/schema""
                     onion:schemaLocation=""http://onion.net/2010/example"">
            <xs:simpleType name=""specialNumber"">
              <xs:restriction base=""xs:integer"">
                <xs:minInclusive value=""3"" />
                <xs:maxInclusive value=""8"" />
              </xs:restriction>
            </xs:simpleType>
          </xs:schema>",
        true);

      // create a container schema
      ISchema containerType = exampleRootType.Children.Create(
        @"<xs:schema elementFormDefault=""qualified""
                     xmlns:xs=""http://www.w3.org/2001/XMLSchema"" 
                     xmlns:onion=""http://onionworks.net/2004/schema""
                     onion:schemaLocation=""http://onion.net/2010/example/container"">
            <xs:element name=""container"" />
          </xs:schema>");

      // allow the container to be created below the system root
      rootSchema.StructureSchemaChildren.Add(containerType);

      // add a simple data schema using our root schema
      ISchema dataType = exampleRootType.Children.Create(
        @"<xs:schema elementFormDefault=""qualified""
                     xmlns:xs=""http://www.w3.org/2001/XMLSchema""
                     xmlns:onion=""http://onionworks.net/2004/schema""
                     onion:schemaLocation=""http://onion.net/2010/example/data"">
            <xs:include schemaLocation=""http://onion.net/2010/example"" />
            <xs:element name=""data"">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name=""text"" type=""xs:string"" />
                  <xs:element name=""number"" type=""specialNumber"" />
                  <xs:element name=""dateTime"" type=""xs:dateTime"" />
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:schema>");

      // allow the data schema to be created below the container
      containerType.StructureSchemaChildren.Add(dataType);
    }
  }
}

Über die Eigenschaft IOnionSession.Schemata gelangen Sie zu allen Operationen, die Sie zur Bearbeitung des Informationsmodells benötigen. Die Schemata sind in einer hierarchischen Ordnung untergebracht. In sich geschlossene Modelle sollten unterhalb eines Wurzelschemas untergebracht sein. XML Schema bietet über das Kompositionswerkzeug xs:include und xs:import die Wiederverwendung von Datentypen externer Schemata. Zu dieser Gruppe gehört noch xs:redefine, die in onion.net die Grundlage für objektorientierte Vererbung darstellt.

Nachdem Sie das Programm ausgeführt haben können Sie im onion.net Editor unterhalb der Systemwurzel das Containerobjekt und darunter beliebige Beispieldatenobjekte anlegen.