7 votes

Comment valider une balise de valeur de chaîne vide en xsd ?

J'ai un fichier xml qui contient des valeurs de date et d'autres types de données.

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

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

Cela fonctionne bien si l'attribut value a une valeur. Mon modèle est validé par rapport à l'attribut value.

Le champ ( purchasedate ) n'est pas obligatoire. si value="", cela signifie que mon motif est également validé par rapport à une chaîne vide, ce qui n'est pas obligatoire.

Je dois valider le champ facultatif et j'utilise <xs:attribute name="PurchaseDate" use="optional"> également.

J'ai besoin de valider ce champ lorsque la balise value n'est pas vide.

9voto

InfantPro'Aravind' Points 5728

C'est trop facile

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

C'est le moyen de le faire. <xs:pattern value="|(Regular_pattern_goes_here)"/>

Pour votre référence, j'ai écrit un exemple de morceaux de codes il suffit de les parcourir .

échantillon 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>

exemple de XSD :(inclut le type personnalisé def)

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

0voto

IordanTanev Points 2934

Essayez d'ajouter l'attribut nillable="true" dans la définition de la balise xml. Vous pouvez également consulter son lien http://www.zvon.org/xxl/XMLSchemaTutorial/Output/ser_over_st0.html
Les meilleures remises,
Iordan

0voto

Jason Ridge Points 901

Le caractère " ?" dans la Regex signifie que le caractère qui le précède doit apparaître 0 ou 1 fois.

Pour résoudre votre problème, vous devez donc mettre l'expression entre parenthèses et placer un point d'interrogation à 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 champ et tout devrait bien se passer.

0voto

Milos Points 51

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 devriez 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 et vous permettra d'utiliser de meilleurs cadres de code plus tard. Je n'ai pas inclus l'attribut "name" car il semblait redondant par rapport 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>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X