2010-02-14 4 views
6

J'ai un fichier xml qui contient des valeurs de date et d'autres types de données.Comment valider une balise de valeur de chaîne vide dans xsd

<Purchasedate Name="purcaseDate" value=""/> 

Je valide ces fichiers xml avec un fichier xsd. Dans xsd shcema j'ai écrit un modèle d'expression régulière pour le format dd/mm/yyyy.

Cela fonctionne très bien si l'attribut value a une valeur. Mon motif est en cours de validation par rapport à l'attribut de valeur. Le champ purchasedate n'est pas obligatoire. if value = "", cela signifie que mon pattern valide aussi par rapport à une chaîne vide, ce qui n'est pas obligatoire. J'ai besoin de valider le champ optionnel et j'utilise aussi <xs:attribute name="PurchaseDate" use="optional">.

Je dois valider ce champ lorsque l'étiquette de valeur n'est pas vide.

Répondre

9

qui est trop facile ..

Tout ce que vous avez à faire est d'inclure spécification de chaîne vide dans votre pattern

Ceci est la façon de le faire .. <xs:pattern value="|(Regular_pattern_goes_here)"/>

Pour votre référence, j'ai écrit des morceaux d'échantillons de codes .. juste passer par les ..

exemple XML:

<?xml version="1.0" encoding="utf-8"?> 
<xmln xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.com XMLFile1.xsd" xmlns="http://www.xsdef.com/xml/123"> 
    <Purchasedate Name="purcaseDate" value=""/> 
</xmln> 

échantillon XSD: (def comprend de type personnalisé)

<xs:schema xmlns:xsLocal="http://www.xsdef.com/xml/123" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.xsdef.com/xml/123" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xs:element name="xmln"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="Purchasedate"> 
      <xs:complexType> 
      <xs:simpleContent> 
       <xs:extension base="xs:string"> 
       <xs:attribute name="Name" type="xs:string" use="required" /> 
       <xs:attribute name="value" type="xsLocal:CUSTOM_DATE" use="required" /> 
       </xs:extension> 
      </xs:simpleContent> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:simpleType name="CUSTOM_DATE"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value="|((01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31)/(01|02|03|04|05|06|07|08|09|10|11|12)/[1-2][0-9][0-9][0-9])"/> 
    </xs:restriction> 
    </xs:simpleType> 
</xs:schema> 
0

Le '?' caractère dans le Regex signifie que le caractère devant lui doit se produire 0 ou 1 fois.

Ainsi, afin de résoudre votre problème, vous devez envelopper la regex entre parenthèses et mettre un questionmark à la fin:

<xs:simpleType name="PurchaseDateType"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value="(Regular_pattern_goes_here)?"/> 
    </xs:restriction> 
    </xs:simpleType> 

Utilisez ce type sur votre domaine et vous devriez être bien

0

Si vous contrôlez la syntaxe du XML, vous devriez envisager de définir l'élément comme suit. Puisque XML-Schema fournit déjà un type de date, vous devez l'utiliser sauf si vous avez une très bonne raison. Je dis cela parce que cela facilitera l'utilisation du XML par d'autres utilisateurs et que vous utiliserez plus tard de meilleurs frameworks de code. Je n'ai pas inclus l'attribut "name" car il semblait redondant au nom de l'élément.

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 

<xs:element name="Purchasedate" nillable="true" type="xs:date"/> 
<xs:element name="Purchasedate2"> 
    <xs:complexType> 
     <xs:attribute name="value" type="xs:date"/> 
    </xs:complexType> 
</xs:element> 
<xs:element name="root"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element ref="Purchasedate"/> 
      <xs:element minOccurs="0" ref="Purchasedate2"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

Questions connexes