web-dev-qa-db-fra.com

xsd: le type d'élément booléen accepte "true" mais pas "True". Comment puis-je le faire accepter?

J'utilise l'option xmllint --schema pour valider mon XML qui ressemble à ceci

<XML>
<Active>True</Active>
</XML>

Dans mon fichier de schéma, j'ai la ligne suivante qui décrit l'élément actif.

<xsd:element name="Active" type="xs:boolean" />

Lorsque j'exécute xmllint, je reçois des messages d'erreur indiquant

/tmp/schema_validation.xml:73: élément Active: erreur de validité des schémas: élément 'Active': 'True' n'est pas une valeur valide de type atomique 'xs: boolean'.

Quand je change le XML en

<Active>true</Active>

Ensuite, le message d'erreur disparaît.

Ainsi, il ressemble à xsd: boolean signifie qu'il est tout en "vrai/faux" en minuscules mais pas en "vrai/faux" pour xmllint .. Ma question est, comment puis-je faire en sorte que xmllint accepte "True" pour xsd: type booléen? Ou existe-t-il différents outils que je peux utiliser pour valider ce XML? Changer le XML ou le schéma n'est pas mon option à ce stade.

Merci!

50
Soichi Hayashi

Vous ne pouvez pas.

Selon la spécification du schéma XML , un booléen est true ou false. True n'est pas valide:

 
 3.2.2.1 Représentation lexicale 
 Une instance d'un type de données défini comme · booléen · peut avoir les 
 Littéraux juridiques suivants {true, false, 1, 0}. 
 
 3.2.2.2 Représentation canonique 
 La représentation canonique du booléen est l'ensemble des 
 Littéraux {vrai, faux}. 

Si l'outil que vous utilisez valide vraiment par rapport à la norme de schéma XML, vous ne pouvez pas le convaincre d'accepter True pour un booléen.

102
Cheeso

xs:boolean est prédéfini en fonction du type d'entrée qu'il accepte. Si vous avez besoin de quelque chose de différent, vous devez définir votre propre énumération:

 <xs:simpleType name="my:boolean">
    <xs:restriction base="xs:string">
      <xs:enumeration value="True"/>
      <xs:enumeration value="False"/>
    </xs:restriction>
  </xs:simpleType>
50
Pavel Minaev

Si vous êtes sous Linux ou si cygwin est disponible sous Windows, vous pouvez exécuter le XML d'entrée via un simple script sed qui remplacera <Active>True</Active> avec <Active>true</Active>, ainsi:

cat <your XML file> | sed 'sX<Active>True</Active>X<Active>true</Active>X' | xmllint --schema -

Si vous ne l'êtes pas, vous pouvez toujours utiliser un processeur xslt non validant (xalan, saxon, etc.) pour exécuter une simple transformation xslt sur l'entrée, puis seulement la diriger vers xmllint.

Ce que le xsl doit contenir quelque chose comme ci-dessous, pour l'exemple que vous avez indiqué ci-dessus (le processeur xslt doit être capable de 2.0):

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
    <xsl:for-each select="XML">
        <xsl:for-each select="Active">
            <xsl:value-of select=" replace(current(), 'True','true')"/>
        </xsl:for-each>
    </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>
3
Anonymous Coward