Eigener Datentyp bestehend aus mehreren double-Werten
rodgerwilco
- schema.org
- xml
Hallo zusammen,
wer kann mir weiter helfen. Ich schreibe gerade ein XML-Schema und an einer Stelle komme ich nicht weiter. Als Wert eines Elements werden 6 double-Werte geschrieben. Wie bekommt man soetwas in einem Schema abgebildet.
<xmlstart>
<topelement>
<transformation>12.34 45.87 10 0.5 0 38</transformation>
</topelement>
</xmlstart>
Dazu suche ich ein Schema
<xs:simpleType name="transformationType">
<xs:restriction base="xs:double">
<xs:pattern value=""/>
</xs:restriction>
</xs:simpleType>
Danke für eure Hilfe
Hallo at,
danke. Nun weiß ich, dass ich mit meinem Beitrag ausführlich zeigen durfte, wie suboptimal meine Schema-Kenntnisse sind. Aber immerhin hab ich die Regex hinbekommen ;-)
Rolf
Hallo Rolf.
danke. Nun weiß ich, dass ich mit meinem Beitrag ausführlich zeigen durfte, wie suboptimal meine Schema-Kenntnisse sind. Aber immerhin hab ich die Regex hinbekommen ;-)
Wenn ich mal Fragen zu Regex habe, werde ich das sehr zu schätzen wissen. Deine Zeit wird kommen.
MfG, at
Hallo rodgerwilco,
wenn du das mit xs:double in ein Schema bringen willst, müsste dein XML so aussehen:
<transformation>
<value>12.34</value>
<value>45.87</value>
<value>10</value>
<value>0.5</value>
<value>0</value>
<value>38</value>
</transformation>
dann kannst Du deinen transformationType auf die Values anwenden.
Wenn Du alle 6 in ein Element bringen willst, kannst Du dafür eine passende Regex als Pattern definieren. Der transformationType sollte dann aber auf xs:string basieren, nicht auf xs:double, und du musst nachher Code haben, der diese Transformationsangabe versteht.
Das Pattern sollte wohl mit \s* beginnen und enden, um führende und abschließende Leerstellen zu erlauben.
Dann müsste es eine Double-Zahl matchen können, das wäre sowas wie (\d+(\.\d*)?|\.\d+)([eE][+-]?\d{1,2})?
. Das ist eine Mantisse, die entweder gar keinen Dezimalpunkt hat, oder mind. eine Stelle davor, oder nur Nachkommastellen hat. Danach folgt ein Exponent bestehend aus e oder E, dann optional ein + oder -, und 1-2 Ziffern. Wenn das nicht passt, musst Du es modifizieren.
Dein Tranformstring besteht dann aus 6 dieser Doubles, durch Space getrennt, das lässt sich mit dem {} Quantifizierer halbwegs abkürzen zu \s*(DDD\s+){5}DDD\s*
(für DDD muss das double-Muster von oben eingesetzt werden).
Aus der Hüfte geschossen würde ich also dies hier schreiben::
<xs:simpleType name="transformationType">
<xs:restriction base="xs:string">
<xs:pattern value="\s*((\d+(\.\d*)?|\.\d+)([eE][+-]?\d{1,2})?\s+){5}(\d+(\.\d*)|\.\d+)([eE][+-]?\d{1,2})?\s**"/>
</xs:restriction>
</xs:simpleType>
Hoffe es funktioniert :) Die Regex habe ich mit RegexStorm getestet, das ist nicht 1:1 Schema-Regex.
Rolf
Danke für eure beiden Antworten. Meine Kenntnisse von RegEx kamen auch ganz, ganz schnell an ihre Grenzen 😉 ich hab es jetzt so gelöst, wobei ich noch nicht ganz glücklich bin, da die Festschreibung auf genau 6 Werte nicht umgesetzt ist und ich bisher nichts gefunden habe, wie es sich umsetzen lässt.
<xs:simpleType name="transformationType">
<xs:list itemType="xs:double" />
</xs:simpleType>
Hallo rodgerwilco,
wenn die Anzahl der Werte vorgegeben sein soll, wirst du tatsächlich nicht um Regex herum kommen. sequence
, minOccurs
und maxOccurs
können nur die Anzahl von Elementen beschränken, nicht aber die von Zeichenketten in Listen.
MfG, at