web-dev-qa-db-fra.com

XSD - autorise le type d'élément en tant qu'entier OR vide

Je dois pouvoir définir un type d'élément simple comme un entier, mais lui permettre également d'être vide. Cet exemple envoie une erreur s'il est vide et qu'un champ vide n'est pas un entier. Comment puis-je contourner cela?

<xsd:element name="weight" type="xsd:integer"/>
14
leanne

Ce que vous devez faire est d’affecter des restrictions au même élément et d’y créer une union, comme dans l’exemple suivant:

<xs:element name="job_code">
  <xs:simpleType>
    <xs:union>
      <xs:simpleType>
        <xs:restriction base='xs:string'>
          <xs:length value="0"/>
        </xs:restriction>
      </xs:simpleType>
      <xs:simpleType>
        <xs:restriction base='xs:integer' />
      </xs:simpleType>
    </xs:union>
  </xs:simpleType>
</xs:element>

En utilisant cette restriction, vous indiquez à la validation xml d'autoriser toute valeur entière et d'autoriser l'élément s'il est vide.

22
Ahmad Hindash

Nous pouvons y parvenir en faisant un SimpleType

<xs:simpleType name="NullOrInteger">
    <xs:restriction base="xs:string">
         <xs:pattern value="\d*|\s{0}" />
    </xs:restriction>
</xs:simpleType>

Ajoutez NullOrInteger en tant que type pour lequel vous souhaitez appliquer une restriction à un entier ou à une valeur null.

par exemple:

<xs:element name="null_or_int" type="NullOrInteger" />
6
krishna pal

Vous devez définir l'attribut "nillable" sur true:

<xsd:element name="weight" type="xsd:integer" nillable="true"/>

Voir le XML ​​Schema Primer .

3
parsifal
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<products xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <product>
        <weight xsi:nil="true"/>
    </product>
</products>

Essayez ce qui précède, devrait fonctionner; vous avez probablement oublié d'ajouter l'attribut xsi: nil. Assurez-vous également que l'élément de poids n'a aucun caractère enfant (un espace blanc ne serait toujours pas acceptable). Si vous devez transmettre certains caractères au lieu d'un entier, vous devez définir un type d'union pour les autoriser.

1
Petru Gardea

Je suis arrivé à cette réponse en cherchant comment obtenir un attribut comme un entier nullable, en utilisant le schéma xsd et en fonction des classes JAXB générées. Je n'ai pas trouvé de réponse ici, alors après l'avoir découverte, j'ai décidé de la partager. La partie xsd suivante générera un type non nullable de int (int):

<xsd:attribute name="length" type="xsd:int" use="required"/>

En code Java, cela se traduira par:

@XmlAttribute(name = "length", required = true)
protected int length;

Si nous abandonnons l'utilisation requise, nous aurons:

@XmlAttribute(name = "length")
protected Integer length;

J'espère que ça aide quelqu'un. Et même si cette réponse n’est peut-être pas liée à la question, je trouve utile d’être ici pour ceux qui arriveront en faisant la même recherche que moi!

1
XMight