Stax mehrere "Kindelemente" zusammen

dima

Neues Mitglied
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:

Java:
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.
 
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 ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P mehrere Parameter in XML (stax) XML & JSON 3
A Interfaces bei StAX XML & JSON 2
R sax, stax, jdom, jaxb? List von Objekten speichern und laden XML & JSON 6
T StAX und Reihenfolge in XML XML & JSON 6
H JAXB und STAX XML & JSON 2
T StAX / SAX => Wie XML Datenstruktur in Java abbilden? XML & JSON 2
Y stax Problem XML & JSON 3
N STAX Serializer (Formatierer)? XML & JSON 2
T StAX und Codierung XML & JSON 3
G Wie Attribute aus XML in ein Model schreiben (StAX)? XML & JSON 7
A StAX formatierung oder auch newline! XML & JSON 2
K stax problem XML & JSON 2
J StAX -- Woodstox Implementation nutzen XML & JSON 6
A StAX API: Cannot Cast from QName to String! XML & JSON 2
S Muss ich bei JAXB immer noch eine zusaetzliche List-Wrapper Klasse erstellen wenn ich mehrere Objekte serialisieren will..? XML & JSON 1
sylo Mehrere XSDs und mehrere Namensräume in einer XML unterbringen? XML & JSON 2
I XSL-FO mehrere Reports in einem PDF XML & JSON 3
A Mehrere Anwender sollen auf eine XML-Datei zugreifen XML & JSON 4
C Mehrere Element_Nodes zusammenfassen zu einem Element XML & JSON 9
S mehrere XML Files mit JaxB XML & JSON 3
T Mehrere gleichnamige Unterelemente auslesen XML & JSON 2
W Kindelemente mit JDOM eines bestimmten Attributes auslesen XML & JSON 6
F KindElemente lesen und begrenzen XML & JSON 0
H Xpath kindelemente auslesen XML & JSON 2

Ähnliche Java Themen

Neue Themen


Oben