XSD - 允许元素类型为整数或为空

22

我需要将一个简单的元素类型设置为整数,但同时允许它为空。如果为空并且空字段不是整数,则会出现错误。如何解决这个问题?

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

你尝试过在原始XML中跳过该元素并将minOccurance = 0标记为XSD吗? - zendu
请参见 https://lists.w3.org/Archives/Public/xmlschema-dev/2003May/0063.html。 - Benj
5个回答

32

你需要做的是在同一元素上设置限制,并对它们执行联合操作,例如以下示例:

<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验证允许任何整数值,并在元素为空时允许该元素。


1
在这种情况下,如果属性不是“required”,那么如果它是一个属性,解析器将使用什么默认值:空字符串还是0? - Ricola3D
这里有一篇有趣的阅读文章:http://www.integratingstuff.com/2010/09/06/solving-unmarshalling-problems-with-jaxbcxf/ - Benj

10

我们可以通过创建一个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" />

4
您需要将“nillable”属性设置为true:
<xsd:element name="weight" type="xsd:integer" nillable="true"/>

请查看XML Schema Primer了解更多信息。

我已经尝试过了,但是出现了这个错误:元素'minimumQuantity':''不是'xs:integer'原子类型的有效值。 - leanne
@leanne - 鉴于您发布的XSD片段,该错误毫无意义。 - parsifal
<?xml version="1.0"?> <xsd:schema xmlns:xsd="" rel = "nofollow noreferrer">http://www.w3.org/2001/XMLSchema"> <xsd:element name="products"> xsd:complexType xsd:sequence <xsd:element name="product" minOccurs = "1" maxOccurs="1" type="productType"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:complexType name="productType"> xsd:sequence
</xsd:complexType> </xsd:schema>
- leanne
XML Schema已按要求提供。无论是否包含Nillable,错误消息都是相同的,它没有任何影响。XML元素“weight”为空,但如果我添加一个整数,那么显然这将起作用,但我需要允许XML节点具有值或为空。感谢您的帮助。 - leanne
@leanne - 你发布的模式包含了一些错误的文本,包括一个分号和一个闭合括号。看到这些之后,我就没有仔细查看内容了。并且,重申一遍 pangea 的话,你还没有提供你的 XML;鉴于错误信息,我怀疑它失败的原因不是空元素。如果你想要进一步的帮助,请在你的帖子中发布一个完整的、自包含的示例程序。 - parsifal
使用nillable方法的做法要求空元素包含xsi:nil属性,例如 <weight xsi:nil="true"></weight>。没有该属性的空元素仍然无法通过验证。 - Burkart

1
<?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元素没有字符作为其子元素(空格也是不可接受的)。如果您必须传递一些字符而不是整数,则必须定义联合类型以允许两者。


1

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

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

在Java代码中,这将导致:
@XmlAttribute(name = "length", required = true)
protected int length;

如果我们不使用 "required",我们将得到:
@XmlAttribute(name = "length")
protected Integer length;

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

你的回答涉及到一个属性,而这个问题是关于一个元素的。只是说一下。 - hakre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接