xml - programacion - xsd: el tipo de elemento booleano acepta "verdadero" pero no "verdadero". ¿Cómo puedo hacer que lo acepte?
manual de programacion android pdf (3)
Estoy usando la opción xmllint --schema para validar mi XML que tiene este aspecto
<XML>
<Active>True</Active>
</XML>
En mi archivo de esquema, tengo la siguiente línea que describe el elemento activo.
<xsd:element name="Active" type="xs:boolean" />
Cuando ejecuto xmllint, recibo mensajes de error que dicen
/tmp/schema_validation.xml:73: elemento Active: Error de validez de los esquemas: Elemento ''Active'': ''True'' no es un valor válido del tipo atómico ''xs: boolean''.
Cuando cambio el XML a
<Active>true</Active>
Entonces el mensaje de error desaparece.
Entonces, parece que xsd: booleano significa que todo es minúsculo "verdadero / falso" pero no "verdadero / falso" a xmllint ... Mi pregunta es, ¿cómo puedo hacer que xmllint acepte "verdadero" para xsd: tipo booleano? ¿O hay diferentes herramientas que puedo usar que validarán este XML? Cambiar el XML o el esquema no es mi opción en este punto.
¡Gracias!
No se puede.
De acuerdo con la especificación del esquema XML , un booleano es true
o false
. True
no es válido:
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 la herramienta que está utilizando realmente valida con el estándar de esquema XML, entonces no puede convencerla de que acepte True para un booleano.
Si está en Linux, o tiene cygwin disponible en Windows, puede ejecutar el XML de entrada a través de un simple script sed que reemplazará a <Active>True</Active>
con <Active>true</Active>
, así:
cat <your XML file> | sed ''sX<Active>True</Active>X<Active>true</Active>X'' | xmllint --schema -
Si no lo está, aún puede usar un procesador xslt no validador (xalan, saxon, etc.) para ejecutar una transformación simple xslt en la entrada, y solo luego canalizarlo a xmllint.
Lo que debe contener el xsl a continuación, como en el ejemplo que mencionó anteriormente (el procesador xslt debe tener capacidad 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>
xs:boolean
está predefinido con respecto a qué tipo de entrada acepta. Si necesita algo diferente, debe definir su propia enumeración:
<xs:simpleType name="my:boolean">
<xs:restriction base="xs:string">
<xs:enumeration value="True"/>
<xs:enumeration value="False"/>
</xs:restriction>
</xs:simpleType>