xsd:boolean type d'élément accepter "vrai", mais pas "Vrai". Comment puis-je l'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" />
quand j'exécute xmllint, j'obtiens des messages d'erreur qui disent
/tmp/schema_validation.xml: 73: élément Actif: erreur de validité du schéma : Élément "actif": "vrai" n'est pas un valeur valide du type atomique "xs: booléen".
quand je change le XML
<Active>true</Active>
alors le message d'erreur disparaît.
donc, il ressemble à xsd: booléen signifie que tout est en minuscules " vrai / faux "mais pas" vrai/faux " à xmllint.. Ma question Est, Comment puis-je faire xmllint pour accepter "True" pour le type xsd:boolean? Ou y a-t-il différents outils que je peux utiliser pour valider ce XML? Modifier le XML ou le schéma n'est pas mon option à ce stade.
Merci!
3 réponses
Vous ne pouvez pas.
Selon spécification du schéma XML, un booléen true
ou false
. True
n'est pas valide:
3.2.2.1 Lexical representation An instance of a datatype that is defined as ·boolean· can have the following legal literals {true, false, 1, 0}. 3.2.2.2 Canonical representation The canonical representation for boolean is the set of literals {true, false}.
si l'outil que vous utilisez valide vraiment la norme XML Schema, alors vous ne pouvez pas le convaincre D'accepter True pour un booléen.
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>
si vous êtes sous Linux, ou si vous avez cygwin disponible sous Windows, vous pouvez exécuter le XML d'entrée par un simple script sed qui remplacera <Active>True</Active>
<Active>true</Active>
, comme ceci:
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 pocessor xslt Non-validant (xalan, saxon etc.) pour exécuter une transformation xslt simple sur l'entrée, et seulement alors le pipe à xmllint.
ce que le XSL devrait contenir quelque chose comme ci-dessous, pour l'exemple que vous avez indiqué ci-dessus (le processeur xslt devrait ê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>