Hallo, ich bin ein Neuling was xml-dateien betrifft. Ich arbeite gerade an einem Projekt um Trainingsdaten welche mit Locus Maps generiert wurden auszuwerten. Dazu will ich als Basis das Projekt GMap.NET nutzen und die Klasse gpx.cs von gpx.xs mit xsd.exe neu generieren lassen. Vorher muss ich allerdings das xsd-file http://www.topografix.com/GPX/1/1/gpx.xsd mit dem Komplexen Typen "TrackPointExtension_t" erweitern. Dieser ist widerum hier beschrieben: http://www8.garmin.com/xmlschemas/GpxExtensions/v3/GpxExtensionsv3.xsd Mein gpx-file sieht so aus (Auszug): <trkseg> <trkpt lat="49.036378" lon="10.692374"> <ele>487.55</ele> <time>2014-02-08T09:54:46Z</time> <pdop>6.96</pdop> <extensions> <gpxtpx:TrackPointExtension> <gpxtpx:hr>82</gpxtpx:hr> <gpxtpx:speed>0.13845086</gpxtpx:speed> </gpxtpx:TrackPointExtension> </extensions> </trkpt> Natürlich muss ich erst den Typen "TrackPointExtension_t" mit dem Element "hr" und "speed" erweitern. Das hat auch geklappt. Allerdings komme ich nicht dahinter wie ich den Typen "TrackPointExtension_t" in "extensions" unterbringe. Ich habe bisher keine passenden Beispiele gefunden an denen ich mich orientieren könnte. Für jemanden der sich mit xml auskennt ist das wahrscheinlich kein Problem.
Hallo Klaus, das klingt nicht nach einem XML-Problem sondern nach einem Konfigurationsproblem für xsd.exe. Dafür kann ich leider nicht weiterhelfen. Von XML-Schema-Seite (xsd) her ist alles prima: * In der Datei "gpx.xsd" ist im Element 'extensions' der XSD-Platzhalter 'any' vorgesehen, der jeglichen fremden XML-Content erlaubt. * Für den Erweiterungsteil existiert ebenfalls ein XSD (GpxExtensionsv3.xsd), welches für diesen Teil zur Validierung genutzt werden kann. * Erst mit der XML-Instanz wird die Verknüpfung beider Schemen erkennbar und kann per XML-Validator bzw. Klassenerzeuger verwendet werden. Innerhalb von "gpx.xsd" ist nicht vorgesehen, das externe Erweiterungsschema zu verlinken. Dieses Konzept ist u.a. unter folgendem Link beschrieben: http://www.xml.com/pub/a/2002/07/03/schema_design.html Das hilft bei der Klassengenerierung leider wenig. Wie "xsd.exe" damit umgeht, weiß ich leider nicht. Viel Erfolg... Suse
Danke für die ausführliche Antwort. Ich werde mir mal den Link zu Gemüte führen.
Ich bins nochmal... In dem gpx.xsd file gibt es das element "extensions". Hier ein Auszug: <xsd:element name="extensions" type="extensionsType" minOccurs="0"> <xsd:annotation> <xsd:documentation> You can add extend GPX by adding your own elements from another schema here. </xsd:documentation> </xsd:annotation> </xsd:element> Auf der anderen Seite das GpxExtensions3.xsd: This schema defines the Garmin extensions to be used with the GPX 1.1 schema. The root elements defined by this schema are intended to be used as child elements of the "extensions" elements in the GPX 1.1 schema. The GPX 1.1 schema is available at http://www.topografix.com/GPX/1/1/gpx.xsd. Ich verstehe das so dass ich die gewünschten Erweiterungen einfach in die andere xml-Beschreibung als Element von "extension" einfüge. Habe ich das falsch verstanden ?
Die Erweiterung wäre folgendes: <xsd:complexType name="TrackPointExtension_t"> <xsd:annotation><xsd:documentation> This type contains data fields available in Garmin GDB track points that cannot be represented in track points in GPX 1.1 instances. </xsd:documentation></xsd:annotation> <xsd:sequence> <xsd:element name="Temperature" type="DegreesCelsius_t" minOccurs="0" /> <xsd:element name="Depth" type="Meters_t" minOccurs="0" /> <xsd:element name="Extensions" type="Extensions_t" minOccurs="0"/> </xsd:sequence> </xsd:complexType> P.S: Sorry für die fehlende Formatierung, aber xml wird hier nicht unterstützt (zumindest ist es mir nicht bekannt)
Klaus schrieb: > Habe ich das falsch verstanden ? Nein, hast du nicht. Aber wie Suse dir schon schrieb, auch wenn du das XML/XSD ordnungsgemäß erweitert hast, hilft das allein deinem xsd.exe noch nicht weiter. Wie man diesem jedoch die Erweiterung beibiegt, musst du dessen Autor(en) befragen. Klaus schrieb: > P.S: Sorry für die fehlende Formatierung, aber xml wird hier nicht > unterstützt (zumindest ist es mir nicht bekannt) Du kannst normale [ pre ]-Markierungen benutzen:
1 | <xsd:complexType name="TrackPointExtension_t"> |
2 | <xsd:annotation> |
3 | <xsd:documentation> |
4 | This type contains data fields available in Garmin GDB track points that cannot |
5 | be represented in track points in GPX 1.1 instances. |
6 | </xsd:documentation> |
7 | </xsd:annotation> |
8 | <xsd:sequence> |
9 | <xsd:element name="Temperature" type="DegreesCelsius_t" minOccurs="0" /> |
10 | <xsd:element name="Depth" type="Meters_t" minOccurs="0" /> |
11 | <xsd:element name="Extensions" type="Extensions_t" minOccurs="0"/> |
12 | </xsd:sequence> |
13 | </xsd:complexType> |
Klaus schrieb: > Natürlich muss ich erst den Typen "TrackPointExtension_t" mit dem > Element "hr" und "speed" erweitern. Das hat auch geklappt. Allerdings > komme ich nicht dahinter wie ich den Typen "TrackPointExtension_t" in > "extensions" unterbringe. Kläre doch mal bitte auf, was genau du gemacht hast. Erst mal musst du überhaupt keine XSD 'erweitern', das ist alles schon fertig. Das ist ja gerade der Witz, das das Schema einen "Extensionpoint" enthält womit du das Erweitern kannst OHNE das Orginalschema zu verändern. Du hast einmal das Basisschema: gpx.xsd Und einmal das Erweiterungsschema: GpxExtensionsv3.xsd Daraus lässt du dir unabhängig voneinander durch den Codegenerator Zugriffsklassen generieren (das Erweiterungsschema ist eigentlich keins da es keine Typen des Orginalschemas erweitert oder importiert). Das Element "extensions" enthält 0...n "Any" Elemente, d.h. Aus anderen Namespaces stamende Elemente sind hier in beliebiger Zahl erlaubt. Deine Zugrifsklasse sollte also etwas wie getAny() o.ä. enthalten. Ob und wie man da jetzt die anderen Zugriffsklassen einfach drauf anwenden kann müsstest du in der .NET API nachschauen, auf jedenfall sollte der Zugriff auf die Elemente und Attribute schon mal so möglich sein. Validieren ist nochmal ein anderes Thema, und dort musst du nur dem Validierer (sofern er das nicht selber durch entprechende Location Angaben kann) nur beide XSD vorwerfen.
:
Bearbeitet durch User
Hi, ich bin wieder hier. Hatte am Wochenende mal andere Dinge im Kopf. Vielen Dank für den letzten Beitrag. Ich habe es so leider nicht umsetzen können. Deswegen habe ich mich für mein weiteres Vorgehen an die Anweisungen in den Original-xsd-Files orientiert. Dazu habe ich innerhalb des gpx.xsd dem komplexen Element "wptType" per Referenz das Element "TrackPointExtension" als Child-Element des Extensionelements hinzugefügt. Diese Element ist in der Datei TrackPointExtensionv1.xsd beschrieben. Jetzt hatte ich immerhin das Element "hr". Um auch noch an die Geschwindigkeit (element "speed") zu kommen musste ich das original TrackPointExtensionv1.xsd von Garmin um das gewünschte Element erweitern. So funktionierts auf jeden Fall. Ob es die sauberste Lösung ist weiß ich nicht. Ich habe mal die xsd- und csharp-sourcen (jeweils im Original und nach der Bearbeitung) angehängt. Falls jemand Lust hat kann er ja nen Diff machen und es kommentieren.
Klaus schrieb: > Ob es die sauberste Lösung ist weiß ich nicht. Nein, gewiss nicht. Das originale XSD verändert man normalerweise nicht.
:
Bearbeitet durch Moderator
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.