我想将数字存储在类型为或其他简单整数类型的XML文件中,但允许用户以十六进制格式输入数字。 XML标准是否允许这样做,因为我找不到任何相关的东西?
例如,如果XSD说:
<xs:element name="value" type="xs:integer" use="required" />
然后我希望XML能够说:
<value>0xFF00FF</value>
或十六进制的任何表示法。
显然我可以尝试但只能证明在一个特定的实现中支持,而不是它是否是标准。我不特别在意保存到XML是否会失去基础。
答案 0 :(得分:4)
我不这么认为。 xs:integer
是xs:decimal
的派生/子集类型,其表示形式为defined as
decimal有一个词法表示,由一个有限长度的十进制数字序列(#x30-#x39)组成,用句点作为十进制指示符分隔。允许使用可选的前导符号。如果省略符号,则假定为“+”。前导零和尾随零是可选的。如果小数部分为零,则可以省略周期和后面的零。例如:-1.23,12678967.543233,+ 100000.00,210。
你可以删除0x并将其设置为hexBinary,尽管你会丢失数字语义。
答案 1 :(得分:4)
我在<xs:pattern>
元素中使用regular expression。
<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>
这允许您存储十进制和十六进制数字(带有强制0x
前缀)。但是,在将字符串转换为数字时,您需要专门处理它。
答案 2 :(得分:3)
我自己需要这个并在这里结束。
这是一个32位无符号整数类型,允许您输入十六进制或十进制值。
<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>
答案 3 :(得分:2)
XSD不允许这样做。
但XSD 1.1确实允许实现定义的方面,包括前词法方面,而Saxon利用这种自由来提供撒克逊:这里描述的预处理方面:
http://www.saxonica.com/documentation/#!schema-processing/extensions11/preprocess
这将允许您接受十六进制表示法作为整数类型的词法表示。唯一的缺点(可能是一个大的!)是它只适用于撒克逊。