Versionsmanagement von medizinischen Daten auf Basis von XML-Schemata
In dieser Arbeit, die im Rahmen des Moduls "Multimedia Software Engineering" entstanden ist, werden die theoretischen Grundlagen zur XML-Schema-Evolution beschrieben und ein Konzept entwickelt, das es ermöglicht, vorhandene medizinische Daten dynamisch an ein neues Datenmodell (Schema) anzupassen. Die besondere Schwierigkeit liegt darin, dass die Daten auf Serverseite verschlüsselt vorliegen, weshalb eine Konvertierung auf Datenbankseite nicht möglich ist. Das entwickelte Konzept wird in Java sowie C# implementiert und arbeitet den Vorgaben entsprechend.
Einleitung
Informatik und Medizin sind längst keine koexistierenden Fachrichtungen ohne Schnittmenge mehr. Beide Disziplinen greifen stark ineinander und werden mittlerweile in speziellen Studiengängen zusammengefasst. So wie in der Wirtschaft der Einsatz der modernen Datenverarbeitung Standard ist, soll auch die Verwaltung von Patienten durch die Informatik vereinfacht werden. Hierbei ist eine enge Zusammenarbeit zwischen Medizinern und Informatikern unerlässlich, um eine zuverlässig arbeitende Software zu erstellen, da Fehler in diesem Bereich schwerwiegende gesundheitliche Konsequenzen haben können. Das OnkoNET ist eine solche Anwendung, die dabei die gesetzlichen Rahmenbedingungen einhält und die tägliche Arbeit eines Arztes vereinfacht, um so die Service- und Behandlungsqualität für den Patienten zu erhöhen.
Binding
Das Binden bezeichnet die automatische Generierung von Klassen aus XML-Schema-Dateien. Auf diese Weise werden Funktionen bereitgestellt, die es ermöglichen, den Zustand eines Objektes zu ändern, was auf eine XML-Datei abgebildet wird, ohne dass der Benutzer XML-Kenntnisse besitzen muss. Die Transformation zwischen XML und Objekt mittels dieser Methoden entspricht dem (de)serialisieren und wird in diesem Zusammenhang (un)marshalling genannt. Ein XML-Binding-Framework umfasst dementsprechend die folgenden Funktionen:
- Binding: Generieren von Klassen aus XML-Schemata
- Marshalling: Serialisieren von Objekten in XML
- Unmarshalling: Deserialisieren von XML in Objekte
Auf diese Weise wird das eigentliche XML-Handling (Parsing) dem Nutzer, unter Nutzung der Fähigkeiten der Programmiersprache, verborgen. Demzufolge stellt das Nutzen eines XML-Binding-Frameworks eine effiziente Alternative zum manuellen Parsing / Verarbeiten per SAX oder DOM dar.
Problem
Zunächst müssen die Begriffe Update und Evolution auseinandergehalten werden. Ein Update bezieht sich immer auf die Änderung der Daten, die Evolution auf die Änderung des Schemas.
Das Datenmodell der Clients wird aus einem XML-Schema generiert und befindet sich stets auf dem aktuellsten Stand. Die serialisierten Objekte in der Datenbank entsprechen jedoch dem Datenmodell, das zum Erzeugungszeitpunkt aktuell war. Wenn sich das Datenmodell zwischenzeitlich geändert hat, schlägt das Deserialisieren fehl. Eine zentrale serverseitige Konvertierung ist nicht möglich, da die Daten verschlüsselt vorliegen und nur auf Clientseite entschlüsselt werden können.
(favorisierte) Lösungsmöglichkeit in .NET
Nach vielen Ansätzen zur manuellen Schemaevolutions-Anpassung ist aufgefallen, dass moderne Serialisierer in der aktuellen Version bereits selbst dazu in der Lage sind, fehlerhafte Schemata zu verarbeiten. Daher wird für zukünftige Entwicklungen die Benutzung folgender Methoden empfohlen:
public String serialize(Object o, XmlSerializerNamespaces ns){
XmlSerializer serializer = new XmlSerializer(o.getType());
MemoryStream memStrm = new MemoryStream();
UTF8Encoding utf8e = new UTF8Encoding();
XmlTextWriter xmlwriter = new XmlTextWriter(memStrm , utf8e);
xmlwriter.Formatting = Formatting. Indented ;
serializer.Serialize(xmlwriter , o, ns);
byte[] utf8EncodedData = memStrm.ToArray();
String xml = utf8e.GetString(utf8EncodedData);
}
public Object deserialize(String xml , Object o){
XmlSerializer serializer = new XmlSerializer(o.getType());
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(xml);
MemoryStream stream = new MemoryStream(bytes);
o = (Object) serializer.Deserialize(stream);
stream.Close();
return o;
}
Um nun die Klassen zu erzeugen, wird die xsd.exe für Schema 1 und 2 aufgerufen (in Schema 2 fehlt das Attribut Name und das Attribut Telefon wurde hinzugefügt):
xsd -schema1 .xsd -Classes -Namespace:Schema1
xsd -schema2 .xsd -Classes -Namespace:Schema2
Die Benutzung dieser Methoden gestaltet sich nun trivial:
Schema1.Daten d = new Schema1.Daten();
d.Alter = 20;
d.Name = "Müller";
d.Vorname = "Peter";
d.XSDVersion = 1;
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns. Add ("tns", "http://tempuri.org/XMLSchema.xsd");
ns. Add ("xs", "http ://www.w3.org/2001/XMLSchema");
String xml = serialize(d, ns);
Console.WriteLine (xml +"\n");
Schema2.Daten d2 = new Schema2.Daten();
d2 = (Schema2.Daten) deserialize(xml, d2);
d2.Telefon = "123";
xml = serialize(d2, ns);
Console.WriteLine(xml);
weiterführende Informationen
Kommentare
Noch keine Kommentare.
