【问题标题】:XSD - allow element type as integer OR emptyXSD - 允许元素类型为整数或为空
【发布时间】:2016-04-25 18:20:30
【问题描述】:

我需要能够将简单元素类型设置为整数,但也允许它为空。如果此示例为空且空白字段不是整数,则此示例发送错误。我怎样才能绕过这个?

<xsd:element name="weight" type="xsd:integer"/>

【问题讨论】:

标签: xsd element


【解决方案1】:

你需要做的是对同一个元素分配限制,并在它们上建立一个联合,例如下面的例子:

<xs:element name="job_code">
  <xs:simpleType>
    <xs:union>
      <xs:simpleType>
        <xs:restriction base='xs:string'>
          <xs:length value="0"/>
        </xs:restriction>
      </xs:simpleType>
      <xs:simpleType>
        <xs:restriction base='xs:integer' />
      </xs:simpleType>
    </xs:union>
  </xs:simpleType>
</xs:element>

通过使用此限制,您可以告诉 xml 验证允许任何整数值,如果元素为空,则允许该元素。

【讨论】:

  • 在这种情况下,如果属性不是“必需的”,如果是属性,解析器的默认值是什么:空字符串或0?
  • 有趣的阅读在这里:integratingstuff.com/2010/09/06/…
【解决方案2】:

我们可以通过制作一个 SimpleType 来实现这一点

<xs:simpleType name="NullOrInteger">
    <xs:restriction base="xs:string">
         <xs:pattern value="\d*|\s{0}" />
    </xs:restriction>
</xs:simpleType>

添加 NullOrInteger 作为您想要限制整数或空值的类型。

例如:

<xs:element name="null_or_int" type="NullOrInteger" />

【讨论】:

    【解决方案3】:

    您需要将“nillable”属性设置为true:

    <xsd:element name="weight" type="xsd:integer" nillable="true"/>
    

    请参阅XML Schema Primer

    【讨论】:

    • 我试过了,但得到这个错误:元素'minimumQuantity':''不是原子类型'xs:integer'的有效值
    • @leanne - 鉴于您发布的 XSD 的 sn-p,该错误没有意义。
    • w3.org/2001/XMLSchema"> > :schema>
    • XML Schema 已按要求在上面。无论是否包含Nillable,错误消息都是一样的,它没有效果。 XML 元素“权重”是空的,但如果我添加一个整数,那么显然这是可行的,但我需要允许 XML 节点有一个值或为空。感谢您的帮助。
    • @leanne - 您发布的架构包含虚假文本,包括分号和右括号。看完这些,我也懒得仔细看内容了。而且,重复pangea,你还没有生成你的XML;鉴于错误消息,我怀疑它失败的原因不是空元素。如果您需要进一步的帮助,请在您的帖子中发布一个完整的、独立的示例程序。
    【解决方案4】:
    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
    <products xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <product>
            <weight xsi:nil="true"/>
        </product>
    </products>
    

    尝试上述方法,应该可以;您很可能忘记添加 xsi:nil 属性。此外,请确保 weight 元素没有作为子元素的字符(仍然不能接受空格)。如果你必须传递一些字符而不是整数,那么你必须定义一个联合类型来允许两者。

    【讨论】:

      【解决方案5】:

      我通过搜索如何使属性成为可为空的整数、使用 xsd 模式以及基于哪些 JAXB 类生成来得出这个答案。我在这里没有找到答案,所以在我找到答案后,我决定分享它。以下 xsd 部分将生成不可为空的 int (int) 类型:

      <xsd:attribute name="length" type="xsd:int" use="required"/>
      

      在 Java 代码中,这将导致:

      @XmlAttribute(name = "length", required = true)
      protected int length;
      

      如果我们放弃所需的使用,我们将得到:

      @XmlAttribute(name = "length")
      protected Integer length;
      

      希望这对某人有所帮助。即使这个答案可能与实际问题无关,我发现对于那些通过与我相同的搜索到达这里的人来说,这里很有用!

      【讨论】:

      • 你的答案涵盖了一个属性,这个问题是关于一个元素的。只是说。
      猜你喜欢
      • 2016-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-15
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      相关资源
      最近更新 更多