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:
xmlns
(default Namespace), xmlns:am
(Namespace des Musikdatenbankverwalters) und xmlns:ci
(Namespace eines Firmendatenanbieters).am:track
und ci:company
.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);
}
}
if (element.getParentNode().getNodeType() == Node.ELEMENT_NODE) {
inScopeNamespaces = getInScopeNamespaces((Element)element.getParentNode());
}
} else {
inScopeNamespaces.put("xmlns:xml","http://www.w3.org/XML/1998/namespace");
}
DomTemplateML.java ist das komplette Java Dokument zu Schritt 2 und 3.
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);
}
}
inScopeNamespaces="name1='value1',name2='value2',..."
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);
}
}
please send comments to xml-vl@dret.net last modification on Tuesday, 02-May-2006 17:28:06 CEST |