【问题标题】:Why this value is '29801000199002684333' long in generation of xsd why not varchar为什么这个值在 xsd 的生成中是 '29801000199002684333' 长为什么不是 varchar
【发布时间】:2019-09-05 12:50:28
【问题描述】:

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

SAX 异常:cvc-maxInclusive-valid:值“29801000199002684333”为 对于 maxInclusive '9223372036854775807' 而言不是方面有效的 输入“长”。

以下代码

  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>

【问题讨论】:

  • 帐号和银行 BIC 号码并不是真正的数字,就像电话号码不是数字一样。 (它们不是数字,因为您永远不会对它们进行算术运算 - 它们实际上是标识符或标签)。您不应在 XSD 中使用数据类型 longint 对它们进行建模。改用字符串类型,并可能添加诸如正则表达式之类的限制以使其只能包含数字。
  • 可能是一个 错误,您的 varchar ('xsd:string) 似乎是唯一正确的解决方案。
  • 杰斯珀爵士,我想你不太了解我。我不这样做。我只得到字符串并将其写入文件,并从文件中生成写入的 xml 到 xsd,借助以下类 XsdGen gen = new XsdGen(); gen.parse(new File("in.xml"));文件输出 = 新文件(“out.xsd”); gen.write(new FileOutputStream(out));然后它会自动写长类型
  • 我不能手动操作一切都应该自动

标签: java xml xsd xsd-validation


【解决方案1】:

您的整个帖子都是关于 XML、XSD 和 Java 的,但您的问题不在于这些。您发布的 XSD 表明 account 的类型为 xsd:long,但您的 XML 的 account 值超过了 xsd:long 的最大允许值。因此,根据您的 XSD,您的 XML 应该是无效的。

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

由于您的问题专门针对xsd-gen,您应该向该工具的开发人员提出issue

【讨论】:

  • 对不起,先生,我是这个社区的新手。谢谢你的明智建议
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    相关资源
    最近更新 更多