xsd:boolean tipo de elemento de aceptar la «verdad», pero no «Verdadero». ¿Cómo puedo hacer es aceptarlo?

Estoy usando xmllint –opción de esquema para validar mi XML que se parece a esto

<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 dice

/tmp/schema_validation.xml:73: elemento
Activo: Esquemas de validez de error :
El elemento ‘Activo’: ‘True’ no es un
los valores válidos de los de tipo atómico
‘xs:boolean’.

Cuando puedo cambiar el XML para

<Active>true</Active>

A continuación, el mensaje de error desaparece.

Así, parece xsd:boolean significa que es todo en minúsculas «verdadero/falso», pero no «True/False» a xmllint.. Mi pregunta es, ¿cómo puedo hacer xmllint a aceptar la «Verdad» para xsd:boolean tipo? O es que hay diferentes herramientas que puedo usar para que validen este XML? Cambiar el XML o el esquema no es mi opción en este momento.

Gracias!

  • Si el cambio de la fuente XML o el esquema no es una opción, entonces yo sugeriría que ejecuta el XML de origen a través de una transformación que normaliza los valores booleanos para el correcto XSD valores válidos.
  • He pensado en hacer eso, pero tenía miedo de modificar los valores que acaba de pasar a ser «Verdadero». Por ejemplo, si un elemento llamado «Descripción» pasa a contener el valor «True», entonces yo no quiero que eso se convierte en «true». No creo que hay alguna forma de saber qué elemento para aplicar la normalización o no..
  • usted necesita ir río arriba: detener la generación de XML no válido en su fuente de origen.

3 Kommentare

  1. 106

    No se puede.

    De acuerdo a la Especificación del Esquema XML, un booleano es true o false. True no es válido:

     
    3.2.2.1 representación Léxica 
    Una instancia de un tipo de datos que se define como ·boolean· puede tener la 
    legales siguientes literales {true, false, 1, 0}. 
    
    3.2.2.2 representación Canónica 
    La representación canónica para booleano es el conjunto de 
    los literales {true, false}. 
    

    Si la herramienta que está utilizando realmente valida contra el Esquema XML estándar, entonces usted no puede convencer a aceptar la Verdadera para un valor booleano.

    • Gracias. Es bueno saber que no hay absolutamente ninguna manera de redefinir xsd:boolean
    • Para decirlo de otra manera – si aguas software genera Cierto por algo se define como un Esquema XML booleano, entonces ellos son, de hecho, la no generación de XML, pero es algo que pasa a ser similar. Su departamento de marketing debe entonces no afirman que el uso de XML, como ahora se han invalidado el punto de uso de XML – la capacidad de reutilización de común analizadores para el bien de la eficiencia.
    • Me gustaría difieren con @Oskar aquí. Hay herramientas que pretenden generar XML, pero en realidad no, porque lo que generan no está bien formado. Pero aquí parece que tienes arriba de software que genera XML que está bien formado, pero no es válido de acuerdo a su Esquema XML. Todavía XML. Ellos simplemente no se puede afirmar que se cumple el Esquema XML que está utilizando.
    • El punto es que el generador de corriente arriba utiliza un estándar de interpretación del esquema, que es la razón por la OP necesita un xmllint que acepta el mismo no-estándar de interpretación de los esquemas.
    • re: OP needs a xmllint that accepts the same non-standard interpretation of the schema. . No hay tal cosa. Herramientas de no llegar a «interpretar» el esquema. El esquema dice «xsd:boolean» y que significa, siempre, en cada caso, de verdadero o falso. No Es Cierto. No Es Falsa. No 1. No 0. No hay espacio para la «interpretación». El generador está mal, y roto.
    • En realidad, 1, 0, también son válidos los valores. Ver: w3schools.com/xml/schema_dtypes_misc.asp

  2. 50

    xs:boolean está predefinido con respecto a qué tipo de entrada que acepta. Si necesitas algo diferente, usted tiene que 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>
    • Gracias! Voy a pedir algo likee esta para ser parte del esquema para que yo pueda trabajar alrededor de esto por ahora.
  3. 3

    Si estás en Linux, o han cygwin disponible en Windows, puede ejecutar el XML de entrada a través de un simple sed de secuencia de comandos 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, usted todavía puede utilizar una validación de xslt pocessor (xalan, saxon, etc.) para ejecutar una simple transformación xslt en la entrada, y sólo entonces la tubería a xmllint.

    Lo que el xsl debe contener algo parecido a continuación, por el ejemplo que aparece más arriba (el procesador xslt 2.0 capaz):

    <?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>
    • Cuidado: dudo que haya ningún «simple sed script» lo suficientemente robusta como para hacer correctamente una sustitución de este tipo en un archivo XML — no es lo tuyo.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea