# Stax mehrere "Kindelemente" zusammen



## dima (19. Dez 2011)

Hallo zusammen, zunächst die Ausgangslage

für ein Projekt an meiner Hochschule möchte ich eine "kleinere" routing software programmieren. Habe eine .osm (xml) der Stuttgarter Innenstadt, diese muß ich nun parsen. Zum Thema parsen habe ich etwas Erfahrung, kriege die Datei auch teilweise geparst. Nun steh ich aber auf dem Schlauch und finde nichts dazu.

hier mal ein kleiner Teil der XML:

[XML]<?xml version="1.0" encoding="UTF-8"?>
<config>
<node id="1250545574" lat="48.7849240" lon="9.1731061" user="pschaefer" uid="153109" visible="true" version="1" changeset="7901851" timestamp="2011-04-18T21:32:42Z"/>
<node id="1250545577" lat="48.7841614" lon="9.1762300" user="pschaefer" uid="153109" visible="true" version="1" changeset="7901851" timestamp="2011-04-18T21:32:42Z"/>
<node id="1250545581" lat="48.7840960" lon="9.1697456" user="pschaefer" uid="153109" visible="true" version="1" changeset="7901851" timestamp="2011-04-18T21:32:42Z"/>
<node id="1250545585" lat="48.7858801" lon="9.1760439" user="pschaefer" uid="153109" visible="true" version="1" changeset="7901851" timestamp="2011-04-18T21:32:42Z"/>
<node id="1250545587" lat="48.7836695" lon="9.1714660" user="pschaefer" uid="153109" visible="true" version="1" changeset="7901851" timestamp="2011-04-18T21:32:42Z"/>
<way id="23274017" user="Max2509" uid="140685" visible="true" version="5" changeset="9447761" timestamp="2011-10-02T06:33:27Z">
		<nd ref="4568903"/>
		<nd ref="1451524025"/>
		<nd ref="1354260401"/>
		<nd ref="31125031"/>
</way>
<way id="33823994" user="pschaefer" uid="153109" visible="true" version="2" changeset="7948348" timestamp="2011-04-23T22:53:06Z">
		<nd ref="387475279"/>
		<nd ref="1257304791"/>
		<nd ref="387475281"/>
		<nd ref="387475282"/>
		<nd ref="387475280"/>
		<nd ref="387475279"/>
		<tag k="building" v="yes"/>
</way>
</config>[/XML]

die Nodes krieg ich ausgelesen inkl ID, LAT und LON
hier mein Code:


```
package Routing;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.EndElement;

import Routing.Vertex;

public class StaxParser{

	static final String NODE = "node";
	static final String ID = "id";
	static final String LAT = "lat";
	static final String LON = "lon";
	static final String WAY = "way";
	static final String WAY_ID = "way_id";
	static final String ND = "nd";
	static final String REF = "ref";
	static final String RELATION = "relation";

	public StaxParser(){	
	}

	public List<Vertex> readConfig(String configFile) {
		   List<Vertex> myKordinaten = new ArrayList<Vertex>();
	
		try {
			// zuerst eine neue XMLInputFactory erstellen
			XMLInputFactory inputFactory = XMLInputFactory.newInstance();
			// einen neuen eventReader einrichten
			InputStream in = new FileInputStream(configFile);
			XMLEventReader eventReader = inputFactory.createXMLEventReader(in);
			// das XML-Dokument lesen
			Vertex myKord = null;
			
			while (eventReader.hasNext()) {
				XMLEvent event = eventReader.nextEvent();
				
				if (event.isStartElement()) {
//				 System.out.println("\n");
					StartElement startElement = event.asStartElement();
					
					if (startElement.getName().getLocalPart() == (NODE)) {
						myKord = new Vertex();
						
						Iterator<Attribute> attributes = startElement.getAttributes();
						while (attributes.hasNext()) {
							Attribute attribute = attributes.next();
							if (attribute.getName().toString().equals(ID)) {
								myKord.setId(attribute.getValue());
								
							}
							else 
							if (attribute.getName().toString().equals(LAT)) {
								myKord.setLat(attribute.getValue());
							}
							else
							if (attribute.getName().toString().equals(LON)) {
								myKord.setLon(attribute.getValue());
							}
					}
					}
//						System.out.println("step1");
					
//					
				}
//				 
				if (event.isEndElement()) {
					EndElement endElement = event.asEndElement();
					if (endElement.getName().getLocalPart() == (NODE)) {
						myKordinaten.add(myKord);
					}
				}
//System.out.println("step2");
				
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (XMLStreamException e) {
			e.printStackTrace();
		}
//		System.out.println(myKordinaten.toString());
//		System.out.println("Anzahl Einträge: "+ myKordinaten.size());
	return myKordinaten;
		}

	public static void main(String args[]) throws Exception{

		StaxParser read = new StaxParser();		
		List<Vertex> readConfig = read.readConfig("Stuttgart_Innenstadt.xml");
		for (Vertex myKord : readConfig) {
			System.out.println(myKord);
			
	}
		
}
}
```

als Ergebnis krieg ich dann folgendes:
Node [ID=1529803289, lat=48.7972627, lon=9.2061134]
Node [ID=1529803295, lat=48.7983045, lon=9.2080911]
Node [ID=1529803348, lat=48.7972361, lon=9.2061412]
Node [ID=1529803360, lat=48.7982728, lon=9.2082437]

ich krieg auch die way id ODER die nd ref
das Problem ist dass ich zu einer way id, alle nd ref brauche und da happerts. wie krieg ich das ausgelesen. und die zweite Frage, wie krieg ich das vernünftig in das Array? Mein Prof möchte nicht dass ich ein zweites Array mache, damit war ich dann total platt.

Als Ergebnis sollte ich vielleicht sowas ähnliches bekommen:
Way [ID= ..., ref= ...
                   ref=...
                   ref=...]

Habt ihr einen Tip, bin jeder Idee dankbar.


----------



## dima (20. Dez 2011)

echt keiner eine Idee?
oder ist die Frage wirklich so dumm?


----------



## nevermind 10844 (20. Dez 2011)

hatte vor ewigkeiten mal damit zu tun.
Auf den ersten Blick würde ich sagen: du merkst dir, dass ein startelement way war, bis endelement way kommt (boolean oder wie auch immer).
Alle startelement die dazwischen kommen, müssen ja nd's sein. Und von denen die attribute auslesen kannste ja.

Also keine Ahnung ob das ein richtiger Ansatz ist, aber bevor niemand seinen Senf dazugibt


----------

