XML - Grundlagen, Prinzipien und Anwendungen

Veranstaltung im Sommersemester 2006

Musterlösung Aufgabe 3 DOM-Zugriff auf XML


Schritt 1 (Einfügen von Namespaces in das XML Dokument)

tracklist.xml ist ein Beispiel eines XML Dokumentes welches mit Namespaces erweitert wurde. Die Idee war, dass die Namespaces in verschiedenen Elementen deklariert werden, damit Schritt 2 und 3 Sinn machen. In der Praxis könnte man auch alle Namespaces im Document Element (root) deklarieren. Zwei Punkte mussten erfüllt werden:


Schritt 2 (Namespace Analyse im XML Dokument mit DOM)

Für das in Schritt 1 erweiterte Dokument mussten mit Hilfe der DOM Schnittstelle in Java die in-scope Namespaces eines beliebigen Elementes ermittelt werden. Dabei handelt es sich nicht um den Namespace, in dem das Element selber definiert ist (d.h. den Namespace auf den das Prefix des Elementes verweist, bzw. den default Namespace, falls kein Prefix verwendet wird), sondern die in diesem Element und den darüberliegenden Elementen deklarierten Namespaces. Dazu mussten die Attribute gefunden werden, welche mit xmlns beginnen:

Hashtable inScopeNamespaces = new Hashtable();
NamedNodeMap currentAttributes = element.getAttributes();

for (int i=0; i<currentAttributes.getLength();i++) {
Node attribute = currentAttributes.item(i);
String name = attribute.getNodeName();
if (name.startsWith("xmlns")) {
String value = attribute.getNodeValue();
inScopeNamespaces.put(name,value);
}
}

Die Methode getInScopeNamespaces musste für alle Parent Element rekursiv aufgerufen werden. Als Abbruchbedingung gilt z.B. die Überprüfung, ob der Parent Node tatsächlich ein Element ist:

if (element.getParentNode().getNodeType() == Node.ELEMENT_NODE) {
inScopeNamespaces = getInScopeNamespaces((Element)element.getParentNode());
}

Da in jedem Element zudem der xml Namespace gültig ist, sollte dieser in jedem Fall an oberster Stelle in die Menge der in-scope Namespaces aufgenommen werden:

} else {
inScopeNamespaces.put("xmlns:xml","http://www.w3.org/XML/1998/namespace");
}

DomTemplateML.java ist das komplette Java Dokument zu Schritt 2 und 3.


Schritt 3 (Editierung des XML Dokumentes mit DOM)

In diesem Schritt ging es darum, basierend auf der Methode in Schritt 2, alle Elemente des XML Dokumentes aus Schritt 1 mit den entsprechenden Namespaces zu versehen. Dazu musste über die Hashtable iteriert und mit Hilfe der DOM Methode setAttribute die Namespace Attribute gesetzt werden:

Hashtable inScopeNamespaces = getInScopeNamespaces(element);
for (Enumeration names = inScopeNamespaces.keys(); names.hasMoreElements();) {
String name = (String)names.nextElement();
String value = (String)inScopeNamespaces.get(name);
if (!element.hasAttribute(name)) {
element.setAttribute(name,value);
}
}

Alternativ konnten die in-scope Namespaces z.B. auch als ein einziges Attribut im entsprechenden Element gesetzt werden:

inScopeNamespaces="name1='value1',name2='value2',..."

Dies musste beginnend beim Document Element (root) für alle Child Elemente gemacht werden. Da die Methode getChildNodes sowohl Elemente wie auch Attribute zurückliefert, musste wiederum eine Überprüfung gemacht werden, ob der Child Node tatsächlich ein Element ist:

NodeList childs = element.getChildNodes();
for (int i=0; i<childs.getLength();i++) {
Node childElement = childs.item(i);
if (childElement.getNodeType() == Node.ELEMENT_NODE) {
setAllNamespaces((Element)childElement);
}
}

Die Ausgabe für diese Methode angewendet auf das Dokument tracklist.xml findet man in output.xml.
please send comments to xml-vl@dret.net
last modification on Tuesday, 02-May-2006 17:28:06 CEST
valid CSS!valid XHTML 1.0!