Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
--- Praktische Informatik (http://www.informatikerboard.de/board/board.php?boardid=6)
---- Softwaretechnik (http://www.informatikerboard.de/board/board.php?boardid=18)
----- XML templates konvertieren (http://www.informatikerboard.de/board/thread.php?threadid=2177)


Geschrieben von hornblower am 19.03.2015 um 14:01:

  XML templates konvertieren

Meine Frage:
Moin moin, ich habe folgendes Problem:

Ich habe 2 verschiedene Programme, das eine zum Routenerstellen in der Seefahrt und das andere um die erstellten Routen mit vorhandenen Wetterinformationen abzugleichen und zu optimieren. Das erste Programm erstellt eine XML Datei, die dann theoretisch in das 2. Programm importiert werden soll. Beide Programme arbeiten mit XML dateien, erkennen aber die jeweils andere datei nicht an. Der erste Header sieht so aus:

<?xml version="1.0" encoding="UTF-8"?>

+<RouteModelType xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

Der 2. So:

<?xml version="1.0" encoding="UTF-8"?>

-<sposroutetemplate xmlns="http://www.meteogroup-maritime.com/spos/routetemplate" xmlVersion="1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

Gibt es eine Möglichkeit, die erste Datei so zu konvertieren, dass sie dem Format der 2. Datei entspricht?

Meine Ideen:
Ich bin leider kein Informatiker.. über google bin ich schon auf mehrere XML converter gestoßen, die jedoch alle nicht das gewünschte Ergebnis gebracht haben. Momentan gebe ich die Daten alle separat in das 2. Programm ein, was aber sehr umständlich und Zeitraubend ist. Daher wäre ich für jede Hilfe dankbar.



Geschrieben von Karlito am 19.03.2015 um 14:55:

 

Hallo hornblower,

XML ist sehr flexibel und kann erst einmal alles mögliche repräsentieren. Die Informationen, die du geschickt hast reichen leider nicht aus.
Der erste "Header" enthält keine Informationen, welche über das Schema des ersten Datenformates auskunft geben. Es ist scheinbar so, dass die Schemainformationen in der XML-Datei selbst mit enthalten sind.
Bei dem zweiten "Header" ist ein Schema verwiesen, was ich jedoch nicht abrufen konnte. Wahscheinlich ist das auch nicht ohne weiteres vorgesehen.
Das Schema beschreibt den Aufbau einer XML-Datei. Ohne Schemainformationen gibt es nur verhältnismäßig grobe Richtlinien, wie eine XML-Datei gestaltet sein muss.

Vermutlich wird es auch keinen fertigen Konverter von dem einen Format in das Andere geben. Das Standard-Mittel für diesen Zweck nennt sich XSLT. Damit ist es möglich XML-Formate ineinander zu transformieren, soweit die Schemata das zulassen.

Wenn Du mehr Daten liefern kannst, kann ich es mir ja mal anschauen.

Gruß,

Karlito



Geschrieben von hornblower am 19.03.2015 um 15:36:

 

Moin Karlito,

vielen Dank für deine schnelle Antwort!
Ich versuche das nochmal etwas ausführlicher zu machen. Dazu habe ich die beiden xml Dateien in .txt dateien reinkopiert. Die erste Datei ist die Ausgabe aus dem planungsprogramm (der elektronischen Seekarte), die 2. Datei die Ausgabe der gleichen Wegpunkten (Die ich in dem Fall manuell eingegeben habe) aus dem Routenprogramm.
Die Kerninformationen sind in beiden Fällen die gleichen, es handelt sich um Wegpunkte mit Positionsangabe nach geographischer Länge und Breite.
Vielen Dank für deine Hilfe!
Beste Grüße,
hornblower

z.B.
Wegpunktname MAAGA Pier, mit Position Lat: 30°25,500´ N und Lon: 009°38,700´ W
wird in der ersten Datei zu:

<Name>MAAGA Pier</Name>

<Latitude>0.5310163376</Latitude>

<Longitude>-0.1683369985</Longitude>

<Notes/>

<Notes/>

<Notes/>

<Notes/>

<Notes/>

<IsParameterPoint>false</IsParameterPoint>

<SailMode>1</SailMode>

<IsArrivalPoint>false</IsArrivalPoint>

<Radius>463</Radius>

<TrackLimit>1000</TrackLimit>

<CourseLimit>0.17453292519943295</CourseLimit>

<Economy>0</Economy>

<MaximalSpeed>2.572222222222222</MaximalSpeed>

und in der 2. zu:

<waypoint name="MAAGA Pier" ignoreLand="false" routeTemplatePointType="Fixed" tracktype="RhumbLine" useSpeed="false" speed="0" delay="PT0S" lon="-9.645" lat="30.425"/>



Geschrieben von Karlito am 19.03.2015 um 16:07:

 

Sieht machbar aus. Ich schaue mir das heute Abend genauer an.

Gruß,

Karlito



Geschrieben von eulerscheZahl am 19.03.2015 um 16:38:

 

Was muss man denn rechnen, um von
code:
1:
2:
<Latitude>0.5310163376</Latitude>
<Longitude>-0.1683369985</Longitude>

auf
code:
1:
lon="-15.473166666666666" lat="28.141166666666667"
zu kommen?



Geschrieben von hornblower am 20.03.2015 um 12:56:

 

Moin, Sry, dass ich erst jetzt antworte.
Das ist in beiden Fällen folgende Positionsangabe verschlüsselt:

Lat: 30°25,500´ N und Lon: 009°38,700´ W

um damit richtig rechnen zu können, wird das von den Programmen in eine Zahl umgewandelt. Bei der Umwandlung wird in der 2. Darstellungsweise die kommagradzahl angegeben. Also Lat: 30grad 25,5 minuten wird zu 30,425 grad und Lon: 9 Grad 38,7 minuten wird zu 9,645 grad.
Dabei sind immer 60 Bogenminuten in einem Grad. Bei West oder Südrichtung ist das Vorzeichen negativ, in Nord und Ostrichtung positiv . lon="-9.645" lat="30.425"/>

In der anderen Darstellungsweise:
Latitude>0.5310163376
Longitude>-0.1683369985
wird das obere Ergebnis nochmal durch 1 rad (180/pi=57,296..) geteilt.



Geschrieben von eulerscheZahl am 20.03.2015 um 13:26:

 

Die Darstellung mit Minuten und Sekunden ist mir bekannt.
Oh man, ich habe jeweils den ersten Eintrag der Liste genommen und nicht gemerkt, dass es sich um verschiedene Punkte handelt, da kann ich lange rechnen unglücklich

Das sollte es tun:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
using System;
using System.IO;
using System.Text;
using System.Globalization;

namespace Koordinaten
{
	class MainClass
	{
		public static void Main (string[] args)
		{
			if (args.Length != 1) {
				Console.WriteLine ("Es muss eine .xml als Argument übergeben werden");
				return;
			}
			string xml;
			using (StreamReader sr = new StreamReader(args[0])) {
				xml = sr.ReadToEnd ();
			}
			xml = xml.Remove (0, xml.IndexOf ("<Name>") + 6);
			string name = xml.Substring (0, xml.IndexOf ("</Name>"));
			StringBuilder output = new StringBuilder ();
			output.AppendLine ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
			output.AppendLine ();
			output.AppendLine ("-<sposroutetemplate xmlns=\"http://www.meteogroup-maritime.com/spos/routetemplate\" xmlVersion=\"1\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">");
			output.AppendLine ();
			output.AppendLine ();
			output.AppendLine ("-<template created=\"2015-02-23T14:13:58.5077114Z\" name=\"" + name + "\">");
			output.AppendLine ();
			output.AppendLine ();
			output.AppendLine ("-<waypoints>");
			output.AppendLine ();
			while (xml.IndexOf("</Waypoints>") > 0) {
				xml = xml.Remove (0, xml.IndexOf ("<Name>") + 6);
				name = xml.Substring (0, xml.IndexOf ("</Name>"));
				xml = xml.Remove (0, xml.IndexOf ("<Latitude>") + 10);
				double latitude = double.Parse (xml.Substring (0, xml.IndexOf ("</Latitude>")), CultureInfo.InvariantCulture) * 180 / Math.PI;
				xml = xml.Remove (0, xml.IndexOf ("<Longitude>") + 11);
				double longitude = double.Parse (xml.Substring (0, xml.IndexOf ("</Longitude>")), CultureInfo.InvariantCulture)* 180 / Math.PI;
				xml = xml.Remove (0, xml.IndexOf ("</Waypoints>") + 12);
				output.AppendLine ("<waypoint name=\"" + name + "\" ignoreLand=\"false\" routeTemplatePointType=\"Fixed\" tracktype=\"RhumbLine\" useSpeed=\"false\" speed=\"0\" delay=\"PT0S\" lon=\"" + longitude.ToString (CultureInfo.InvariantCulture) + "\" lat=\"" + latitude.ToString (CultureInfo.InvariantCulture) + "\"/>");
				output.AppendLine ();
			}
			output.AppendLine ("</waypoints>");
			output.AppendLine ();
			output.AppendLine ("</template>");
			output.AppendLine ();
			output.AppendLine ("</sposroutetemplate>");
			Console.Write (output.ToString ());
		}
	}
}


Im Anhang ist eine .exe, läuft mit mono auch unter Linux.

Verwendung: starte die Kommandozeile, gib dann ein
code:
1:
Koordinaten.exe Quelldatei > Zieldatei


Melde dich, wenn du damit nicht zurechtkommst. Eine Benutzeroberfläche ist schnell erstellt (da wäre es aber hilfreich, zu wissen, welches Betriebssystem du verwendest).



Geschrieben von Karlito am 20.03.2015 um 13:42:

 

Hallo euler,

die "-" stammen vermutlich nicht aus der XML-Datei, sondern kommen durch das Kopieren aus dem Browser zustande... Ich würde sie also weg lassen.

Gruß,

Karlito



Geschrieben von eulerscheZahl am 20.03.2015 um 13:45:

 

Die hatten mich auch schon verwirrt - und auch einen XML Parser, mit dem ich es zuerst probiert hatte.
Ich warte mal ab, bis sich der Fragesteller wieder meldet.



Geschrieben von hornblower am 20.03.2015 um 15:19:

 

Moin moin,

Vielen Dank für eure Hilfe!

Die - vor den Waypoints etc stammen aus der xml Datei und lassen dort die Unterinformationen verschwinden. siehe Bild

Die Koordinaten Datei habe ich runtergeladen, jedoch kommt direkt nach dem Öffnen eine Fehlermeldung und ich muss es wieder schliessen. Keine Ahnung ob die Signatur hilft...:

Problemsignatur:
Problemereignisname: CLR20r3
Problemsignatur 01: Koordinaten.exe
Problemsignatur 02: 1.0.5557.24043
Problemsignatur 03: 550c10c6
Problemsignatur 04: mscorlib
Problemsignatur 05: 4.0.30319.34209
Problemsignatur 06: 534894cc
Problemsignatur 07: 4527
Problemsignatur 08: 105
Problemsignatur 09: System.IO.DirectoryNotFound
Betriebsystemversion: 6.3.9600.2.0.0.768.101
Gebietsschema-ID: 1031
Zusatzinformation 1: 5861
Zusatzinformation 2: 5861822e1919d7c014bbb064c64908b2
Zusatzinformation 3: a10f
Zusatzinformation 4: a10ff7d2bb2516fdc753f9c34fc3b069

Ich benutze Win 8.1 64Bit

Im Kompatibilitätsmodus mit win 7/XP funktioniert das leider auch nicht.

Beste Grüße,

hornblower



Geschrieben von Karlito am 20.03.2015 um 15:36:

 

Hi,

Zitat:
Original von hornblower
Die - vor den Waypoints etc stammen aus der xml Datei und lassen dort die Unterinformationen verschwinden. siehe Bild


Nope, es ist so wie ich es mir gedacht habe großes Grinsen Die - sind nicht in der original-XML-Datei enthalten. Das ist nur die Ansicht im Browser...

Zitat:
Original von hornblower
Die Koordinaten Datei habe ich runtergeladen, jedoch kommt direkt nach dem Öffnen eine Fehlermeldung und ich muss es wieder schliessen. Keine Ahnung ob die Signatur hilft...:

Problemsignatur:
Problemereignisname: CLR20r3
Problemsignatur 01: Koordinaten.exe
Problemsignatur 02: 1.0.5557.24043
Problemsignatur 03: 550c10c6
Problemsignatur 04: mscorlib
Problemsignatur 05: 4.0.30319.34209
Problemsignatur 06: 534894cc
Problemsignatur 07: 4527
Problemsignatur 08: 105
Problemsignatur 09: System.IO.DirectoryNotFound
Betriebsystemversion: 6.3.9600.2.0.0.768.101
Gebietsschema-ID: 1031
Zusatzinformation 1: 5861
Zusatzinformation 2: 5861822e1919d7c014bbb064c64908b2
Zusatzinformation 3: a10f
Zusatzinformation 4: a10ff7d2bb2516fdc753f9c34fc3b069



@euler: In der exe die Du gebaut hast, ist der Pfad zur Eingabedatei leider noch hart kodiert (c:\home\eulerschezahl...)

Gruß,

Karlito



Geschrieben von eulerscheZahl am 20.03.2015 um 15:50:

 

Ich dachte, das hätte ich rausgelöscht...

Naja, hier nochmal mit GUI, die Version sollte es jetzt tun.
Bedienung sollte sich von selbst erklären, hoffe ich.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace XMLConverter
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void buttonBrowseSource_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            if (ofd.ShowDialog() == DialogResult.OK)
                textBoxSource.Text = ofd.FileName;
        }

        private void buttonBrowseDest_Click(object sender, EventArgs e)
        {
            SaveFileDialog sfd = new SaveFileDialog();
            if (sfd.ShowDialog() == DialogResult.OK)
                textBoxDest.Text = sfd.FileName;
        }

        private void buttonStart_Click(object sender, EventArgs e)
        {
            string xml;
            try
            {
                using (StreamReader sr = new StreamReader(textBoxSource.Text))
                {
                    xml = sr.ReadToEnd();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Fehler beim Lesen der Datei:\n\n" + ex);
                return;
            }
            xml = xml.Remove(0, xml.IndexOf("<Name>") + 6);
            string name = xml.Substring(0, xml.IndexOf("</Name>"));
            StringBuilder output = new StringBuilder();
            output.AppendLine("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
            output.AppendLine();
            output.AppendLine("<sposroutetemplate xmlns=\"http://www.meteogroup-maritime.com/spos/routetemplate\" xmlVersion=\"1\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">");
            output.AppendLine();
            output.AppendLine();
            output.AppendLine("<template created=\"2015-02-23T14:13:58.5077114Z\" name=\"" + name + "\">");
            output.AppendLine();
            output.AppendLine();
            output.AppendLine("<waypoints>");
            output.AppendLine();
            while (xml.IndexOf("</Waypoints>") > 0)
            {
                xml = xml.Remove(0, xml.IndexOf("<Name>") + 6);
                name = xml.Substring(0, xml.IndexOf("</Name>"));
                xml = xml.Remove(0, xml.IndexOf("<Latitude>") + 10);
                double latitude = double.Parse(xml.Substring(0, xml.IndexOf("</Latitude>")), CultureInfo.InvariantCulture) * 180 / Math.PI;
                xml = xml.Remove(0, xml.IndexOf("<Longitude>") + 11);
                double longitude = double.Parse(xml.Substring(0, xml.IndexOf("</Longitude>")), CultureInfo.InvariantCulture) * 180 / Math.PI;
                xml = xml.Remove(0, xml.IndexOf("</Waypoints>") + 12);
                output.AppendLine("<waypoint name=\"" + name + "\" ignoreLand=\"false\" routeTemplatePointType=\"Fixed\" tracktype=\"RhumbLine\" useSpeed=\"false\" speed=\"0\" delay=\"PT0S\" lon=\"" + longitude.ToString(CultureInfo.InvariantCulture) + "\" lat=\"" + latitude.ToString(CultureInfo.InvariantCulture) + "\"/>");
                output.AppendLine();
            }
            output.AppendLine("</waypoints>");
            output.AppendLine();
            output.AppendLine("</template>");
            output.AppendLine();
            output.AppendLine("</sposroutetemplate>");
            try
            {
                using (StreamWriter sw = new StreamWriter(textBoxDest.Text))
                    sw.Write(output.ToString());
                MessageBox.Show("erledigt!");
            }
            catch (Exception ex)
            {
                MessageBox.Show("Fehler beim Schreiben der Datei:\n\n" + ex);
            }
            
        }
    }
}



Geschrieben von hornblower am 20.03.2015 um 16:31:

 

Das ist der Wahnsinn wie das funktioniert! Vielen Dank!

Das Programm würde ich gerne in meiner Diplomarbeit erwähnen. Wäre das ok für euch? Und welche Quellenangaben kann ich dafür verwenden?

Beste Grüße,

hornblower



Geschrieben von eulerscheZahl am 20.03.2015 um 16:50:

 

Klar, kannst du machen.
Als Quelle würde ich einfach http://www.informatikerboard.de/board/thread.php?threadid=2177 angeben.

Da der Aufbau der Eingangsdatei recht starr ist und sich nur die Anzahl der Punkte sowie deren Werte ändern, habe ich einfach den string zerlegt.
Wenn man komplexere Strukturen analysieren will, gibt es dafür fertige Parser. Die nehmen einem dann die Arbeit des Auslesens ab und ermöglichen es, die einzelnen Knoten abzuarbeiten.



Geschrieben von hornblower am 20.03.2015 um 17:23:

 

Alles klar, dann werde ich das so machen!
Vielen Dank nochmal!
Das Programm ist so perfekt, es geht nur darum, dass die Positionsangaben mit den Wegpunktnamen nicht alle manuell eingegeben werden müssen.
Beste Grüße,

hornblower


Forensoftware: Burning Board, entwickelt von WoltLab GmbH