rodgerwilco: Eigener Datentyp bestehend aus mehreren double-Werten

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

  1. Hallo rodgerwilco,

    dein Suchbegriff lautet: list

    MfG, at

    1. 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

      1. 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

  2. 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

    1. 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>
      
      1. 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