为什么这个值是'29801000199002684333' long in generation of xsd why not varchar

Why this value is '29801000199002684333' long in generation of xsd why not varchar

我正在检查 xml 到 xsd 格式。但是当我尝试使用从该站点 https://www.tutorialspoint.com/xsd/xsd_validation.htm 获得的以下代码将 xml 格式数据转换为 xsd 时 我想知道为什么 20 位数字显示长类型并且它给了我以下错误

SAX Exception: cvc-maxInclusive-valid: Value '29801000199002684333' is not facet-valid with respect to maxInclusive '9223372036854775807' for type 'long'.

使用以下代码

  SchemaFactory factory =
           SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
   Schema schema = factory.newSchema(new File("out.xsd"));
   Validator validator = schema.newValidator();
   validator.validate(new StreamSource(new File("in.xml")));

如何避免这个问题我想以 varchar 类型而不是 long 类型查看此数据

XSD格式

<xsd:sequence>
<xsd:element name="account" minOccurs="0" type="xsd:long"/>
<xsd:element name="branchBIC" minOccurs="0" type="xsd:int"/>
<xsd:element name="branchCode" minOccurs="0" type="xsd:int"/>
<xsd:element name="currencyIsoCode" minOccurs="0" type="xsd:normalizedString"/>
   </xsd:sequence>

XML格式

   <account>40700810256895634168</account>
      <branchBIC>040037470</branchBIC>
       <branchCode>1</branchCode>
     <currencyIsoCode>RUR</currencyIsoCode>

您的整个 post 大约是 XML、XSD 和 Java,但您的问题在于其中的 none。您的 posted XSD 说 account 是类型 xsd:long,但是您的 XML 的 account 值超过了 xsd:long。因此,根据您的 XSD,您的 XML 无效。

从您的评论来看,您似乎对正在使用的工具选择了类型 xsd:long 而不是 xsd:string 感到不高兴。这应该是您问题的突出部分,而不是隐藏在评论中,因为您使用的 XsdGen class 是您问题的基础。

由于您的问题具体涉及 xsd-gen, you should raise an issue 该工具的开发者。

当您从 XML 实例生成模式时,您要求该工具进行大量猜测。例如,您要求它猜测 3872-12-14 是一个日期还是只是一些随机字符串。它必须进行的示例越多,它就越有可能猜对,但有时它总是会出错。当它看到一个帐号时,它如何知道它是一个整数还是一个字符串?区别很重要,因为如果它选择 xs:integer,那么前导零将被认为是无关紧要的,并且会丢失。因此,所有用于模式生成的工具都需要人工检查输出并对其进行微调。有些工具可能比其他工具做出更好的猜测,但其中 none 永远是完美的,因为该过程需要对数据进行语义理解。