2010-11-19 9 views
6

Ich versuche, ein Schema Regel in XSD zu definieren, für die eine Zeichenfolge ist 8 Zeichen lang:XSD regulären Ausdruck: diese oder nichts

<PostedDate>42183296</PostedDate> 

und raumfüllend ist auch erlaubt:

<PostedDate>  </PostedDate> 

die der XSD führte mich:

<xs:simpleType name="DateFormat"> 
    <xs:restriction base="xs:string"> 
     <xs:length value="8" />   //exactly 8 characters long 
</xs:simpleType> 

aber der Wert kann auch e sein mpty (d.h. Null Zeichen):

<PostedDate></PostedDate> 
<PostedDate /> 

, die mich dazu gebracht, zu naiv versuchen:

<xs:simpleType name="DateFormat"> 
    <xs:restriction base="xs:string"> 
     <xs:length value="8" />   //exactly 8 characters long 
     <xs:length value="0" />   //exactly 0 characters long 
</xs:simpleType> 

Was natürlich nicht erlaubt.

Wie es oft der Fall in XSD, können die meisten Formate nicht ohne weiteres mit XSD dargestellt werden, so entschied ich einen regulären Ausdruck Regel zu versuchen:

.{8} | "" 

die i-Typ zu konvertieren versuchen, XSD:

<xs:simpleType name="DateFormat"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value=".{8}|''" /> 
    </xs:restriction> 
</xs:simpleType> 

Aber es hat nicht funktioniert:

''20101111' is not facet-valid with respect to pattern '.{8}|''' for type 'DateFormat' 

ich habe auch versucht

  • <xs:pattern value="[0-9]{8}|''" />
  • <xs:pattern value="([0-9]{8})|('')" />
  • <xs:pattern value="(\d{8})|('')" />

Kann jemand anderes, was für ein Muster, das das Problem löst passende entweder - einige spezifische Muster - leer

Bonus: können jemand zeigt auf den Platz in the XSD documentation, die besagt, dass \d mit Ziffern übereinstimmt? Oder was sind die anderen speziellen Mustercodes?

+0

Ich denke '\ d {8}?' Sollte funktionieren. '?' bedeutet, dass alles, was davor ist, optional ist. –

Antwort

11

Ich rate mal, dass Muster wie \d{8}| aussehen sollten, das bedeutet "acht Ziffern oder nichts", aber nicht acht Ziffern oder zwei Anführungszeichen. Dies erklärt jedoch nicht, warum 20101111 nicht übereinstimmt. Sind Sie sicher, dass im Elementwert keine Leerzeichen oder andere zusätzliche Symbole enthalten sind? es sonst erlaubt ist, muss 6 Länge Zahlen
\d wird die Ziffern im Abschnitt „F.1.1 Zeichenklasse Escapes“

+0

Das ist der Trick, den ich nie herausgefunden hätte '\ d {8} |' bedeutet * "acht Ziffern | nichts" *. Hinterhältig. Und du hast recht; Ich weiß nicht, warum mein Muster '. {8} | ''' vorher nicht mit '20101111' übereinstimmte - es tut es jetzt.Obwohl ich zuvor eine Website verwendet habe, um xml + xsd zu validieren. Seit dem Mittagessen habe ich ein XML-Studio-Programm geschrieben, um mehr interaktives Feedback zu geben. –

+2

Es ist auch wichtig zu beachten, dass eine 'xs: totalDigits'-Einschränkung ** nach ** einer' xs: pattern' Einschränkung kommen muss. Andernfalls konvertiert der Parser intern den Text '000001' in die einzelne Ziffer' 1', was dann nicht mit dem Muster '(\ d) {6}' übereinstimmt, da es nicht 6 Zeichen lang ist! –

3

ich auch in der gleichen Situation wie leere Zeichenkette übereinstimmen. Endlich benutzte ich das Folgende. Das funktioniert für mich

<xs:simpleType name="DateFormat"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value="|[0-9]{8}" /> 
    </xs:restriction> 
</xs:simpleType>