# XPath Problem: finden einer Node nach Attributswert



## tonmann (30. Jun 2010)

Folgendes Problem: ich bräuchte als Rückgabe eigentlich ein Element, für die Verwendung in anderen Methoden. Ich wollte mir also eine Node zurück geben lassen, deren Name ich auslesen und über eine andere Methode ein Element mit dem gewonnenen Namen als ID heruassuchen kann.
Jedoch gibt es hier ständig Probleme beim erhalten einer passenden Node.
ein solches Element hat in der XML File folgende Struktur:
[XML]<id gername="" engname= ""/>[/XML]

Gesucht wird nach diesen beiden gername und engname, da diese in einer Swing jList angezeigt und darüber ausgewählt werden sollen.


```
Exception in thread "main" java.lang.ClassCastException: org.jdom.Document cannot be cast to org.w3c.dom.Node
	at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.eval(Unknown Source)
	at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.eval(Unknown Source)
	at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.evaluate(Unknown Source)
	at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.evaluate(Unknown Source)
	at test.Xmltest.searchObjectbyTrivial(Xmltest.java:173)
	at test.Xmltest.main(Xmltest.java:103)
```


```
/*
 * searches the document for the Object which has the english or german name specified, which is of the specified Object type.
 * @param type String the type of the Object to be searched
 * @param name the Name of the Object to be searched. this is not the ID
 * @return Element the Object as its xml Element representation
 */
public Element searchObjectbyTrivial(String type,String name) throws XPathExpressionException{
	Element work;
//	String query;
	
	
	String xpathE = new String("//Objects/" + type + "/*[@gername=" + name + "|@engname=" + name + "]");
	javax.xml.xpath.XPath xpath = XPathFactory.newInstance().newXPath();
	XPathExpression expr = xpath.compile(xpathE);
	System.out.println(doc.getContent().toString());
	work = doc.getRootElement();
	System.out.println(work.getContent().toString());
	//Object result = expr.evaluate(expr);
	Object result = expr.evaluate(doc);
	Node node = (Node) result;
	work = work.getChild("Objects").getChild(type).getChild(node.getNodeName());
	System.out.println(node.getNodeName());
	System.out.println(node.getLocalName());
	return work;
}
```
der Konstruktor der Klasse und die Fields sind hier zu sehen:

```
public class Xmltest {
	
	//Document document;
	Document doc;
	SAXBuilder sxbuild;
	Element rootelement;
	URL inputSource;
	URI path;
	XMLCreatorModule xmlmodule;
	
	public Xmltest(){
		
		
		
		
		sxbuild = new SAXBuilder();
		doc = null;
		
		try {
			inputSource = new URL("file:./Test oder so.xml");
		} catch (MalformedURLException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		System.out.println(inputSource.getPath());
		
		try {
		//	document = sxbuild.build(inputSource);
			doc = sxbuild.build(inputSource);
		} catch (JDOMException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		/*rootelement = document.getRootElement();
		System.out.println(rootelement.getChildren().toString());
		XMLOutputter out = new XMLOutputter();
		try {
			out.output(document, System.out);
		} catch (IOException e) {
			e.printStackTrace();
		}
			System.out.println();
		*/
		
	}
```

Kann mir jemand sagen, wie ich den Code abändern muss, damit das funktioniert? ich sitze schon stunden daran, und bisher hat mir weder tutorial noch documentation oder API weitergeholfen...
Ich wollte allerdings nicht durch das jeweilige Dokument durchiterieren und das mit mit if-abfragen löchern, bis ich das element habe, wenns nicht schöner(einfacher) geht.


----------



## Noctarius (30. Jun 2010)

[link]http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/xpath/XPathExpression.html#evaluate(org.xml.sax.InputSource, javax.xml.namespace.QName)[/link]


```
NodeList nodes = expression.evaluate(document, XPathConstants.NODESET);
```


----------



## tonmann (30. Jun 2010)

aso, da hab ich wohl den wald vor lauter bäumen nicht gesehen.
danke dir, funktioniert jetzt (endlich!)


----------

