2012-08-01 29 views
6

Quiero almacenar un número en un archivo XML con tipo u otro tipo de entero simple, pero permitir que el usuario ingrese el número en un formato hexadecimal. ¿El estándar XML lo permite porque no puedo encontrar nada relevante?XML xs: int valor hexadecimal

Por ejemplo, si el XSD dice:

<xs:element name="value" type="xs:integer" use="required" /> 

entonces quiero el XML para poder decir:

<value>0xFF00FF</value> 

o lo que sea la notación hexadecimal sería.

Obviamente puedo probarlo, pero eso solo prueba el soporte en una implementación en particular, no si es un estándar. No me importa en particular si guardar en XML pierde la base.

Respuesta

4

No lo creo. xs:integer es un tipo derivado/subconjunto de xs:decimal, que la representación es defined as

decimal tiene una representación léxica que consiste en una secuencia de longitud finita de dígitos decimales (# x30- # x39) separados por un período como indicador decimal . Se permite un signo principal opcional. Si se omite el signo, se asume "+". Los ceros iniciales y finales son opcionales. Si la parte fraccionaria es cero, el período y el siguiente cero (es) pueden ser omitidos. Por ejemplo: -1.23, 12678967.543233, +100000.00, 210.

Puede quitar el 0x y establecerlo en hexabinario, aunque pierde el número semántico.

2

XSD no permite esto.

Pero XSD 1.1 sí permite facetas definido por la implementación, incluyendo las facetas de pre-léxicas, y Saxon explota esta libertad de prestación del sajón: preproceso faceta describe aquí:

http://www.saxonica.com/documentation/#!schema-processing/extensions11/preprocess

Esto permitirá aceptar Notación hexadecimal como una representación léxica de un tipo entero. El único inconveniente (¡probablemente uno grande!) Es que solo funcionará con Saxon.

4

Usaría un regular expression en un elemento <xs:pattern>.

<xs:element name="value" use="required"> 
    <xs:simpleType> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value="0x[0-9A-Fa-f]+|[0-9]+"/> 
    </xs:restriction> 
    </xs:simpleType> 
</xs:element> 

Esto le permite almacenar tanto decimal y número hexadecimal (con prefijo 0x obligatoria). Sin embargo, deberá manejarlo específicamente al convertir la cadena en un número.

1

Lo necesitaba yo mismo y terminé aquí.

Aquí hay un tipo entero sin signo de 32 bits que le permitirá ingresar el valor como hexadecimal o decimal.

<xs:simpleType name="U32BitHexInt"> 
    <xs:union memberTypes="xs:unsignedInt"> 
    <xs:simpleType> 
     <xs:restriction base="xs:token"> 
     <xs:pattern value="0x[0-9A-Fa-f]{8}"/> 
     </xs:restriction> 
    </xs:simpleType> 
    </xs:union> 
</xs:simpleType> 
Cuestiones relacionadas