Forum: PC-Programmierung gpx.xsd erweitern


von Klaus (Gast)


Lesenswert?

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.

von Klaus (Gast)


Lesenswert?

Kann mir niemand helfen ?

von Suse (Gast)


Lesenswert?

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

von Klaus (Gast)


Lesenswert?

Danke für die ausführliche Antwort. Ich werde mir mal den Link zu Gemüte 
führen.

von Klaus (Gast)


Lesenswert?

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 ?

von Klaus (Gast)


Lesenswert?

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)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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>

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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
von Klaus (Gast)


Lesenswert?

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.

von Klaus (Gast)


Angehängte Dateien:

Lesenswert?

Sorry, hab den Anhang vergessen. Hier bitte.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.