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:
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.
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.