Werte aus XML Doc

MettMax

Grünschnabel
Hallo Leute,
ich versuche aus einer XML Datei die folgendermaßen aussieht, die Werten von lon und lat herauszubekommen:
HTML:
<?xml version="1.0" encoding="UTF-8"?>
<gpx 
	xmlns="http://www.topografix.com/GPX/1/1" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd" 
	creator="www.OpenRouteService.org" version="1.1">
	<trk>
		<name>Route</name>
		<trkseg>
					<trkpt lon="7.0892567" lat="50.7265543"/>
					<trkpt lon="7.089248823722613" lat="50.72653868037818"/>
					<trkpt lon="7.089294" lat="50.7265159"/>
					<trkpt lon="7.0975221" lat="50.7296986"/>
					<trkpt lon="7.1033282" lat="50.7289039"/>
					<trkpt lon="7.1035322" lat="50.7289761"/>
					<trkpt lon="7.1037983" lat="50.7290793"/>

		</trkseg>
	</trk>
</gpx>

Das Einlesen der XML Datei ist kein Problem, allerdings schaffe ich es nicht die Werte zu isolieren.
Ich möchte später eine Liste haben in der in diesem Falle stehen sollte:

7.0892567|50.7265543
7.089248823722613|50.72653868037818
[...]

Ich habe einen bescheidenen Veruch gestartet... ich kenne mich leider überhaupt nicht mit XML parsen aus.
Code:
             XmlDocument routedoc;
            XmlNodeList nodelist;
            routedoc = new XmlDocument();
            routedoc.LoadXml(richTextBox1.Text);
            nodelist = routedoc.SelectNodes("//trkpt");
       [....]

Es wäre nett wenn jemand von euch mir hier helfen könnte, wahrscheinlich ist das Problem ja relativ einfach zu lösen.
Ansonsten nehme ich einfach Stringfunktionen.

Danke
Max
 
Sind dann in einem XML-File mehrere Routen oder genau eine?

Ich hab in die Richtung auch noch nicht viel gemacht.
Also nicht sauer sein wenns noch nicht zum erhofften Ergebnis führt.


Ich hab mal versucht durch den Tree zu navigieren.
Falls du nur eine Liste mit Strings brauchst, hoffe ich dass das schon weiter hilft.
Code:
            XNamespace nameSpace = "http://www.topografix.com/GPX/1/1";

            XElement root = XElement.Load(@"D:\test.xml");

            IEnumerable<string> query = from trk in root.Elements()
                                        from trkseg in trk.Elements(nameSpace + "trkseg")
                                        from trkpt in trkseg.Elements()
                                        select trkpt.Attribute("lon").Value +"|"+ trkpt.Attribute("lat").Value;

Du könntest die Werte aber auch in einer Hilfsklasse separat ablegen.
Eine Möglichkeit wäre z.B. so:
Code:
            XNamespace nameSpace = "http://www.topografix.com/GPX/1/1";

            XElement root = XElement.Load(@"D:\test.xml");


            var query = from trk in root.Elements()
                        from trkseg in trk.Elements(nameSpace + "trkseg")
                        from trkpt in trkseg.Elements()
                        select new { Ion = trkpt.Attribute("lon").Value, Lat = trkpt.Attribute("lat").Value };

            foreach (var hilfsklasse in query)
            {
                Console.WriteLine("Ion: " + hilfsklasse.Ion + " Lat: " + hilfsklasse.Lat);
            }


Wahrscheinlich wäre es sinnvoller die Werte gleich zu casten:
Code:
   select new { Ion = Double.Parse(trkpt.Attribute("lon").Value), Lat = Double.Parse(trkpt.Attribute("lat").Value) };
 
Zuletzt bearbeitet:
Hallo Leute!
Danke für eure Antworten.
BackgroundWorker mit deinem Post konnte ich mir die Sache so zusammenbauen wie ich sie haben wollte, ich habe es zwar ein bischen anders gemacht, aber dein Post hat mir die nötigen Werkzeuge geliefert. Dankeschön.
In einer XML Datei ist immer nur eine Route gespeichert.

ich habe auch den Post mit den Datasets überflogen, wahrscheinlich wäre das wirklich sinnvoll. Ich werde mir das später genauer ansehen. Momentan ist mir allerdings nur wichtig, dass mein Programm irgendwie funktioniert, da ich ein bischen unter Zeitdruck stehe ;).

Ich habe allerdings noch ein Problem, ich probiere die GPX daten auf ein Kartenstück umzurechnen und dann dort einen Pfad einzumalen. Damit nur der Pfad eingezeichnet wird, der gerade sichtbar ist muss ich die GPX Daten rausfiltern die außerhalb der momentan sichbaren Karte liegen.
Mein Vorgänger in dem Projekt hat dazu eine Zeile Code hinterlassen, die ich aufgrund mangelnder XML Kentnisse nicht verstehe, aber vermute dass sie etwas damit zu tun haben könnte ,vielleicht könntet ihr mir erklären was genau dort passiert.

Code:
routedoc.SelectNodes("//trkpt[7.77<=@lon and @lon<=7.775 and 49.4377<=@lat and @lat<=49.44]");
bezogen auf die von mir gepostete XML Datei.


Vielen Dank
Max
 
Schön dass du etwas weiter gekommen bist.
Also wie du die Daten umrechnen musst kann ich dir leider nicht sagen.
Dein Vorgänger liest mit der Zeile die Einträge aus die zwischen bestimmten Grenzen liegen.
Also ion zwischen 7.77 und 7.775 und lat zwischen 49.4377 und 49.44.
HTML:
<trkpt lon="7.773" lat="49.438"/>
Diese Zeile würde er z.B. auslesen.

Aber mal ne Frage: Kannst du bei dem was du da programmierst nicht auf bestehenden Code zurückgreifen und anpassen bzw. erweitern?
In der Firma in der ich als Werkstudent arbeite ist auch die Frage aufgetaucht ob sie sich ein Programm kaufen sollen um ihre Kunden in einer Landkarte anzuzeigen oder selber was programmieren.
Drum probier ich grad ein bisschen mit GMap.NET rum.
http://greatmaps.codeplex.com/
 

Neue Beiträge

Zurück