2012-08-01 11 views
6

Desidero memorizzare un numero in un file XML con tipo o un altro tipo di intero semplice, ma consentire all'utente di immettere il numero in formato esadecimale. Lo standard XML lo consente perché non riesco a trovare nulla di rilevante?XML xs: int valore esadecimale

Ad esempio, se il XSD dice:

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

allora voglio il codice XML per essere in grado di dire:

<value>0xFF00FF</value> 

o qualunque sia la notazione esadecimale per sarebbe.

Ovviamente posso provarlo ma questo dimostra solo supporto in una particolare implementazione, non se si tratta di uno standard. Non mi interessa particolarmente se salvare in XML perde la base.

risposta

4

Non credo. xs:integer è un derivato/sottoinsieme di tipo xs:decimal, cui la rappresentazione è defined as

decimale ha una rappresentazione lessicale costituito da una sequenza di lunghezza finita di cifre decimali (# x30- # x39) separati da un periodo come indicatore decimale . È consentito un segno di testa opzionale. Se il segno è omesso, si assume "+". Gli zeri iniziali e finali sono facoltativi. Se la parte frazionaria è zero, il periodo e gli zero successivi possono essere omessi. Ad esempio: -1.23, 12678967.543233, +100000.00, 210.

È possibile rimuovere il 0x e impostarlo su hexBinary, anche se si perde il numero semantico.

2

XSD non lo consente.

Ma XSD 1.1 fa consentire sfaccettature di implementazione definiti, compresi gli aspetti di pre-lessicali, e Saxon sfrutta questa libertà di prestazione sassone: preprocess Facet descritto qui:

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

Ciò consentirebbe di accettare notazione esadecimale come rappresentazione lessicale di un tipo intero. L'unico inconveniente (probabilmente un grosso problema!) È che funzionerà solo con Saxon.

4

Vorrei usare un regular expression in 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> 

Questo consente di memorizzare sia decimale ed esadecimale (con obbligo 0x prefisso). Tuttavia, dovrai gestirlo in modo specifico durante la conversione della stringa in un numero.

1

Ne avevo bisogno e sono finito qui.

Qui è un tipo intero senza segno a 32 bit che vi permetterà di inserire il valore sia come esadecimale o decimale.

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