# xPath liefert leeres Nodeset



## MI-Stud (26. Nov 2010)

Hallo an Alle,

nachdem ich nun "Prof. Google" genervt und X-Foren durchwühlt habe muss ich euch doch mit meinem Problem belästigen. Ich denke mal das vielen diese Frage direkt bekannt vorkommen wird, jedoch waren sämmtliche Internethilfen, die ich bisher gefunden habe für mein Problem nicht der Stein der weisen.

Ich habe folgenden JavaCode von IBM "geklaut" und lediglich den XPath-Ausdruck und den Dateipfad angepasst.

```
/*
			 * IBM CODE
			 */
		    DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
		    domFactory.setNamespaceAware(true); // never forget this!
		    DocumentBuilder builder = domFactory.newDocumentBuilder();
		    Document doc = builder.parse("c:/test/meineXML.xml");
		    
		    XPathFactory factory = XPathFactory.newInstance();
		    XPath xpath = factory.newXPath();
		    try
		    {
		    	XPathExpression expr = xpath.compile("//ItemRef");
		    	Object result = expr.evaluate(doc, XPathConstants.NODESET);
			    NodeList nodes = (NodeList) result;
		        System.out.println(nodes.getLength());
		    }
		    catch(XPathException e)
		    {
		    	System.out.println(e.getMessage());
		    }
```

In meiner XML-Datei kommen definitiv!!!! mehrere ItemRef Elemente vor. Der Ausdruck "//*" selektiert mir auch wirklich ALLE Knoten in XML. Nur sobald ich das ganze einschränken möchte, bekomme ich IMMER eine leere Nodelist zurück.

Auszug aus der XML-Datei:
[XML]
<?xml version="1.0" encoding="UTF-8"?>
<ODM FileOID="ODM.1278323463921" Description=“BLA" FileType="Snapshot" Granularity="All" CreationDateTime="2010-08-02T11:33:39+02:00" ODMVersion="1.3" Originator="Formedix" SourceSystem="Origin Study Modeller" SourceSystemVersion="2.7.0" xmlns="http://www.cdisc.org/ns/odm/v1.3" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.cdisc.org/ns/odm/v1.3
http://www.cdisc.org/models/odm/v1.3/ODM1-3-0Rev.xsd">
	<Study OID="S.0123">
		<GlobalVariables>
			<StudyName>Testfile</StudyName>
			<StudyDescription>Testfile zum testen</StudyDescription>
			<ProtocolName>Protokoll Testfile</ProtocolName>
		</GlobalVariables>
......
                        <ItemGroupDef OID="IG.0001" Name="Arterielle Hypertonie" Repeating="No">
				<Description>
					<TranslatedText xml:lang="en">Arterial hypertension</TranslatedText>
				</Description>
				<ItemRef ItemOID="I.0032" Mandatory="Yes" OrderNumber="1"/>
				<ItemRef ItemOID="I.0002" Mandatory="Yes" OrderNumber="2"/>
				<ItemRef ItemOID="I.0003" Mandatory="Yes" OrderNumber="3"/>
			</ItemGroupDef>
			<ItemGroupDef OID="IG.0002" Name="Regelmäßig Sport" Repeating="No">
				<ItemRef ItemOID="I.0005" Mandatory="Yes" OrderNumber="1"/>
				<ItemRef ItemOID="I.0006" Mandatory="Yes" OrderNumber="2"/>
				<ItemRef ItemOID="I.0008" Mandatory="Yes" OrderNumber="3"/>
			</ItemGroupDef>
.......

[/XML]
Ich hoffe ihr könnt mir helfen. Bin seit mehr als einer Woche an diesem Problem dran.

Grüße

MI-Stud

PS: Ist mein erster Eintrag hier im Forum, daher sorry wenn etwas mit der Formatierung nicht ganz hinhauen sollte


----------



## eRaaaa (26. Nov 2010)

Das würde so funktionieren, wenn du kein Namespace definieren würdest.
Soll heißen, du kannst mal probieren aus
[xml]
<ODM FileOID="ODM.1278323463921" Description=“BLA" FileType="Snapshot" Granularity="All" CreationDateTime="2010-08-02T11:33:39+02:00" ODMVersion="1.3" Originator="Formedix" SourceSystem="Origin Study Modeller" SourceSystemVersion="2.7.0" xmlns="http://www.cdisc.org/ns/odm/v1.3" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.cdisc.org/ns/odm/v1.3
http://www.cdisc.org/models/odm/v1.3/ODM1-3-0Rev.xsd">
[/xml]
nur
[xml]
<ODM FileOID="ODM.1278323463921" Description=“BLA" FileType="Snapshot" Granularity="All" CreationDateTime="2010-08-02T11:33:39+02:00" ODMVersion="1.3" Originator="Formedix" SourceSystem="Origin Study Modeller" SourceSystemVersion="2.7.0">
[/xml]

zu machen...dann sollte es gehen.

In deinem Fall(also ohne die XML-Datei jetzt bezüglich des Namespaces abzuändern) könntest du folgendes machen:

- eine neue Klasse 

```
class ODMNamespaceContext implements NamespaceContext {

	public String getNamespaceURI(String prefix) {
		if (prefix == null)
			throw new NullPointerException("Null prefix");
		else if ("ns".equals(prefix))
			return "http://www.cdisc.org/ns/odm/v1.3";
		return XMLConstants.NULL_NS_URI;
	}

	// This method isn't necessary for XPath processing.
	public String getPrefix(String uri) {
		throw new UnsupportedOperationException();
	}

	// This method isn't necessary for XPath processing either.
	public Iterator getPrefixes(String uri) {
		throw new UnsupportedOperationException();
	}
}
```

und dann

```
XPathFactory factory = XPathFactory.newInstance();
		XPath xpath = factory.newXPath();
		xpath.setNamespaceContext(new ODMNamespaceContext());  // <---
		XPathExpression expr = xpath.compile("//ns:ItemRef");  // <----
		Object result = expr.evaluate(doc, XPathConstants.NODESET);
		NodeList nodes = (NodeList) result;
		System.out.println(nodes.getLength());
```


----------



## MI-Stud (26. Nov 2010)

Hallo,

Danke dir für die schnelle Antwort. 

Genau daran lag es. Jetzt funktioniert alles bestens.


----------

