# JDOM und XPath - Problem mit Namespace ohne Prefix



## Faruun (25. Mai 2007)

Hallo Leute,

ich habe ein Problem, dass ich trotz Suche bisher nicht lösen konnte. Ich hoffe mir kann hier jemand helfen 

Also:

Ich habe eine vorgegebene xml-Datei, die ich gern nach Elementen durchsuchen möchte.

Auszug aus der xml-Datei (etwas anonymisiert  ):

```
<?xml version="1.0" encoding="UTF-8"?>
<configuration  xmlns="http://www.tolle-url.de/configuration" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.tolle-url.de/configuration configuration.xsd">
		<formstore xsi:type="filesystem-formstore" id="formstore_admin">
			<root-path>${system:baseDir}/formstores/admin</root-path>
			<unpack>true</unpack>
			<versioning>false</versioning>
		</formstore>
		<formstore xsi:type="filesystem-formstore" id="formstore_unternehmen">
			<root-path>${system:baseDir}/formstores/forms_unternehmen</root-path>
			<unpack>true</unpack>
			<versioning>false</versioning>
		</formstore>
		<formstore xsi:type="filesystem-formstore" id="formstore_verwaltung">
			<root-path>${system:baseDir}/formstores/forms_verwaltung</root-path>
			<unpack>true</unpack>
			<versioning>false</versioning>
		</formstore>
		<formstore xsi:type="filesystem-formstore" id="formstore_buerger">
			<root-path>${system:baseDir}/formstores/forms_buerger</root-path>
			<unpack>true</unpack>
			<versioning>false</versioning>
		</formstore>
	</server>
</configuration>
```

Um die Datei einzulesen und darin suchen zu können, habe ich JDOM benutzt. 

Java-Code:

```
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.Namespace;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;
import org.jdom.xpath.XPath;


public class ConfigurationParser {
	/**
	 * @param args
	 * @throws IOException 
	 * @throws JDOMException 
	 */
	
	public static void parse(String datei) throws JDOMException, IOException {
		
	    SAXBuilder saxBuilder = new SAXBuilder();
	    Document doc  = saxBuilder.build(new File(datei));
	    Element root = doc.getRootElement();
	    
	    // Ausgaben zur Überprüfung
	    Namespace nameSpace = root.getNamespace();
	    System.out.println("Namespace: " + nameSpace); //Namespace wird korrekt ohne Prefix ausgegeben
	    
	    System.out.println("Datei: " + doc);
	    
	    // Zum Test, ob die xml-Datei komplett gelesen wird.
	    XMLOutputter outputter = new XMLOutputter();
		outputter.output(doc, System.out);
	
	    XPath formstoreSuche = XPath.newInstance("//formstore");
	    formstoreSuche.addNamespace("","http://www.tolle-url.de/configuration"); //Hier scheint das Problem zu sein
	    System.out.println(formstoreSuche.getXPath());
	    
	    List formstores = formstoreSuche.selectNodes(doc); //Hier erwarte ich die gefundenen Formstores
	    
	    System.out.println("Liste \"formstore\": " + formstores); //Liste bleibt leer
	    
	    for (Iterator iter = formstores.iterator(); iter.hasNext();) {
			Element singleFormstore = (Element) iter.next();
			List children = singleFormstore.getChildren();
			List attr = singleFormstore.getAttributes();
			System.out.println("Attributes: " + attr);
			System.out.println("Children: " + children);
			
			
			System.out.println("Formstore: " + singleFormstore);
			
		}
		
	}
	
	public static void main(String[] args) throws JDOMException, IOException {
		// TODO Auto-generated method stub
		
		parse("test.xml");
		
	}

}
```

Wie man sehen kann, ist dem Namespace kein Prefix mitgegeben worden. Wenn ich händisch in die xml-Datei einen Prefix eingebe und im Java-Code diesen mit addNamespace(String nameSpace,Strng url) übergebe, dann funktioniert es, ebenso, wenn ich den Namespace einfach lösche. Leider kann ich beides nicht machen, da die xml-Datei fest vorgegeben ist.

Ich hoffe die Frage ist nicht zu banal, aber ich komm einfach nicht weiter und auch google und dieses Forum konnte mir nicht weiterhelfen ...

Hat vielleicht jemand einen heißen Tipp für mich?

Gruß,
Faruun


----------



## clemson (25. Mai 2007)

Hallo!

Probier einmal anstatt


```
formstoreSuche.addNamespace("", "http://www.tolle-url.de/configuration");
```

folgendes:


```
Namespace configNS = Namespace.getNamespace("http://www.tolle-url.de/configuration");
formstoreSuche.addNamespace(configNS);
```

mfg


----------



## Faruun (25. Mai 2007)

Hallo Clemson,

danke für den Tipp. ich kann es leider erst wieder am Dienstag testen, werde mich dann aber melden, ob es geklappt hat 

Gruß,
Faruun


----------



## Faruun (31. Mai 2007)

Hallo,

sorry für den späten Test. Leider hat es aber auch nicht funktioniert. Die Liste von Elementen bleibt trotz Änderung leer 

Hat jemand noch eine Idee?

Gruß,
Faruun


----------



## clemson (31. Mai 2007)

Hallo!

Also ich habe jetzt folgendes probiert und es hat funktioniert.

Soweit ich das verstanden habe, gibt es in XPath keinen default Namespace. Deshalb muß man einen Pseudo-Namespace in der XPath Abfrage definieren. Siehe www.nabble.com/again-xpath-with-default-namespace-t3669331.html


```
XPath formstoreSuche = XPath.newInstance("//x:formstore");
Namespace nsConfig = Namespace.getNamespace("x", "http://www.tolle-url.de/configuration");
formstoreSuche.addNamespace(nsConfig);
```


----------



## Faruun (4. Jun 2007)

Hallo,

hat funktioniert! 
Vielen Dank für die Hilfe.

gruß,
Faruun


----------

