studio programacion móviles libros libro desarrollo desarrollar curso aprende aplicaciones xml xsd boolean

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>