58 votes

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

Je suis à l'aide de 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="xsd:boolean" />

Quand je lance xmllint, j'obtiens des messages d'erreur qui dit:

/tmp/schema_validation.xml:73: élément Active: Schémas de validité d'erreur : L'élément 'Active': 'True' n'est pas un valeur valide de type atomique xs:boolean'.

Lorsque je modifie le fichier XML

<Active>true</Active>

Puis le message d'erreur disparaît.

Ainsi, il ressemble xsd:boolean signifie qu'il est tout en minuscule "vrai/faux", mais pas "Vrai/Faux" à xmllint.. Ma question est, comment puis-je faire xmllint à accepter "True" xsd:boolean type? Ou est-il différent des outils que je peux utiliser qui permettra de valider le document XML? Changer le XML ou le schéma n'est pas mon option à ce stade.

Merci!

112voto

Cheeso Points 87022

Vous ne pouvez pas.

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


 3.2.2.1 représentation Lexicale
 Une instance d'un type de données est défini comme ·boolean· peut avoir l' 
 juridiques suivantes littéraux {true, false, 1, 0}. 

 3.2.2.2 représentation Canonique
 La représentation canonique booléenne est l'ensemble des 
 les littéraux {true, false}. 

Si l'outil que vous utilisez réellement valide par rapport au Schéma XML standard, alors vous ne pouvez pas les convaincre d'accepter Vrai pour une valeur booléenne.

52voto

Pavel Minaev Points 60647

xs:boolean est prédéfini en ce qui concerne le type d'entrée accepté. 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>
 

3voto

Si vous êtes sur Linux, ou ont cygwin disponible sur Windows, vous pouvez exécuter le XML d'entrée grâce à un simple script sed qui remplacera <Active>True</Active> avec <Active>true</Active>, comme suit:

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 une non-validation de xslt pocessor (xalan, saxon, etc.) pour exécuter une simple transformation xslt sur l'entrée, et alors seulement, la pipe à xmllint.

Ce que celle-ci devrait contenir quelque chose comme ci-dessous, pour l'exemple que vous avez énumérés ci-dessus (le processeur xslt doit être compatible 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>

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