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