# Java, XPath und die Frage nach der Elementnummer



## marbles (22. Juni 2005)

Hallo Zusammen,

ich hantiere mit jdom und xpath auf einem xml document, java 5.0. 
Jetzt lasse ich mir alle Elemente auf der untersten ebene ausgeben. 
Zu jedem dieser Elemete möchte ich wissen das wievielte Element der Parent ist. 
Also in etwa so. 
Ich habe das A in der Hand und möchte nun wissen, dass es unter dem ersten parent Element hängt, bei D entsprecehend dann unter dem zweiten. 
Ich könnte natrülich einfach über die parents loopen und die jeweilige parent nummer übergeben. aber ich würde das gerne von child element aus erfragen, gibt es da eine möglichkeit? 

<parent>
 <child>A</child>
 <child>B</child>
</parent>

<parent>
 <child>C</child>
 <child>D</child>
</parent>

vielen dank


----------



## Thomas Darimont (22. Juni 2005)

Hallo!

 Ganz easy:

```
/**
  * 
  */
 package de.tutorials;
 
 import java.io.StringReader;
 
 import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
 import javax.xml.xpath.XPathFactory;
 
 import org.w3c.dom.Node;
 import org.xml.sax.InputSource;
 
 /**
  * @author Tom
  * 
  */
 public class XPathExample {
 
 	/**
 	 * @param args
 	 */
 	public static void main(String[] args) throws Exception {
 		String xml = "<?xml version=\"1.0\"?>" + 
 		    			"<root>" + 
 		    		    	"<parent>" + 
 		    		    		"<child>A</child>" + 
 		    		    		"<child>B</child>" + 
 		    		    	"</parent>"	+ 
 		    		    	"<parent>" + 
 		    		    		"<child>C</child>" + 
 		    		    		"<child>D</child>" + 
 		    		    	"</parent>" + 
 		    		    	"<parent>" + 
 		    		    		"<child>E</child>" + 
 		    		    		"<child>F</child>" + 
 		    		    	"</parent>" +
 		    		    "</root>";
 		System.out.println(xml);
 
 		XPath xPath = XPathFactory.newInstance().newXPath();
 		InputSource is = new InputSource(new StringReader(xml));
 
 		// Node auswählen der C enthält:
 		Node node = (Node) xPath.evaluate("//child[text() = 'C']", is,
 				XPathConstants.NODE);
 		Node parent = node.getParentNode();
 
 		Double precedingSiblingCount = (Double) xPath.evaluate(
 		    	"count(preceding-sibling::*)", parent, XPathConstants.NUMBER);
 		System.out.println("Position Eltern-Elements: "
 				+ (precedingSiblingCount + 1));
 
 		//Elemente mit Inhalt A,B -> ElternElement Position 1 (erstes Element)
 		//Elemente mit Inhalt C,D -> ElternElement Position 2 (zweites Element)
 		//Elemente mit Inhalt E,F -> ElternElement Position 3 (drittes Element)
 	}
 }
```
 
 Gruß Tom


----------

