# Xpath kindelemente auslesen



## hans66 (8. Jun 2006)

Hallo, bin ziemlich neu mit java und Xpath.

Mein Problem:
Ich ahb ein xml - File das sieht folgendermassen aus:

<FAMILY javabean='yes' >
   <INDIVIDUAL upn='2' gender='0' generation='0' tree='7' >
     <PROGENYINTERNALINDIVIDUAL x='59.0' y='87.0' >
     </PROGENYINTERNALINDIVIDUAL>
     <SIBLING siblingid='3' >
     </SIBLING>
     <SYMBOL  >
     </SYMBOL>
     <DATA> 
          <FIELD fieldid='3' value='10.02.1971' >
          </FIELD>
          <FIELD fieldid='2' value='Andrea' >
          </FIELD>
          <FIELD fieldid='1' value='Jafjafw' >
          </FIELD>
     </DATA> 
   </INDIVIDUAL>
   <INDIVIDUAL upn='3' gender='1' hlight='1' generation='0' tree='7' >
     <PROGENYINTERNALINDIVIDUAL x='204.0' y='85.0' >
     </PROGENYINTERNALINDIVIDUAL>
     <SYMBOL  >
     </SYMBOL>
     <DATA> 
          <FIELD fieldid='3' value='' >
          </FIELD>
          <FIELD fieldid='2' value='' >
          </FIELD>
          <FIELD fieldid='1' value='' >
          </FIELD>
     </DATA> 
   </INDIVIDUAL>
  </FAMILY> 


Nun möchte ich folgende Daten aus dem XML - File heraus filtern und in einer Hashmap speichern.
die upn: Sie soll mein key für die Hashmap sein.
Dann sollen die Daten die zu dem upn gehören als objekt in die Hashmap mit rein.

Wenn das getan ist soll das nächste Individual genommen werden und das ganze wieder genauso.
Mein Problem is dass ich die Zuordnung zwischen der upn und den zugehörigen Daten (<data> ) nicht hinbekomme.

Kann mir da jemand helfen???? Bitte...


----------



## clemson (8. Jun 2006)

wenn du mit jdom arbeitest, könntest du es folgendermaßen machen...

stellt sich die frage ob du es mit jdom lösen willst bzw. wie deine struktur in der map aussehen soll (was soll als value gespeichert werden?)

XmlTest.java

```
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

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

/**
 * @version $Revision: $, $Date: $
 */
public class XmlTest
{

	/**
	 * @param args
	 * @throws IOException
	 * @throws JDOMException
	 */
	public static void main(String[] args) throws JDOMException, IOException
	{
		new XmlTest();
	}

	public XmlTest() throws JDOMException, IOException
	{
		// build parser and set up inputstream
		SAXBuilder builder = new SAXBuilder();
		InputStream in = this.getClass().getResourceAsStream("file.xml");

		// build document and get root element
		Document xmlDoc = builder.build(in);
		Element familyElement = xmlDoc.getRootElement();

		// get all 'individual' elements
		List<Element> individualElements = XPath.selectNodes(familyElement, "/FAMILY/INDIVIDUAL");
		System.out.println("individualElements.size() = " + individualElements.size());

		Map<Long, Element> dataMap = new HashMap<Long, Element>();

		// iterate over all 'individual elements'
		Iterator<Element> iterator = individualElements.iterator();
		Element individual, data;
		long upn;
		while (iterator.hasNext())
		{
			individual = iterator.next();

			// get the upn attribute value and the data child
			upn = Long.parseLong(individual.getAttributeValue("upn"));
			data = individual.getChild("DATA");

			// add key-value pair to map
			dataMap.put(upn, data);
		}

		printMap(dataMap);

	}

	private void printMap(Map<Long, Element> map)
	{
		StringBuilder mapString = new StringBuilder("map: [");

		Iterator<Long> keyIterator = map.keySet().iterator();
		long upn;
		Element data;
		while (keyIterator.hasNext())
		{
			upn = keyIterator.next();
			data = map.get(upn);

			mapString.append("[upn: ").append(upn).append("[");
			mapString.append(data).append("]]");
		}

		System.out.println(mapString.toString());
	}

}
```

file.xml

```
<FAMILY javabean='yes'>
	<INDIVIDUAL upn='2' gender='0' generation='0' tree='7'>
		<PROGENYINTERNALINDIVIDUAL x='59.0' y='87.0'></PROGENYINTERNALINDIVIDUAL>
		<SIBLING siblingid='3'></SIBLING>
		<SYMBOL></SYMBOL>
		<DATA>
			<FIELD fieldid='3' value='10.02.1971'></FIELD>
			<FIELD fieldid='2' value='Andrea'></FIELD>
			<FIELD fieldid='1' value='Jafjafw'></FIELD>
		</DATA>
	</INDIVIDUAL>
	<INDIVIDUAL upn='3' gender='1' hlight='1' generation='0' tree='7'>
		<PROGENYINTERNALINDIVIDUAL x='204.0' y='85.0'></PROGENYINTERNALINDIVIDUAL>
		<SYMBOL></SYMBOL>
		<DATA>
			<FIELD fieldid='3' value=''></FIELD>
			<FIELD fieldid='2' value=''></FIELD>
			<FIELD fieldid='1' value=''></FIELD>
		</DATA>
	</INDIVIDUAL>
</FAMILY>
```


----------



## clemson (8. Jun 2006)

bzw. an das data element eines individiual-elements - bei gegebener upn id - kommst du folgendermaßen mittels xpath heran:


```
/FAMILY/INDIVIDUAL[@upn='2']/DATA
```


fürs einarbeiten in xpath kann ich dir das tutorial bei www.zvon.org empfehlen.


----------

