为什么我的xml无法通过XSD验证?

Ben*_*ton 2 php xml validation xsd

我有一个问题,空值在一台服务器上验证失败,但它适用于我所有其他服务器.问题发生在较新的PHP版本(5.3.8)上,适用于较旧的版本(5.2.4).

以下是一些失败的孤立元素:

XML输入:

<clbburnfuelbias></clbburnfuelbias>
<clbburntimebias></clbburntimebias>
Run Code Online (Sandbox Code Playgroud)

XSD验证:

  <xs:element name="clbburnfuelbias"  type="data-fuelbias"/>
  <xs:element name="clbburntimebias"  type="data-timebias"/>

  <xs:simpleType name="data-fuelbias">
    <xs:restriction base="xs:integer">
      <xs:minInclusive value="-9900"/>
      <xs:maxInclusive value="9900"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="data-timebias">
    <xs:restriction base="xs:integer">
      <xs:minInclusive value="-59"/>
      <xs:maxInclusive value="59"/>
    </xs:restriction>
  </xs:simpleType>
Run Code Online (Sandbox Code Playgroud)

错误:

错误1824:元素'clbburnfuelbias':该值不是原子类型'data-fuelbias'的有效值.错误1824:元素'clbburntimebias':该值不是原子类型
'data-timebias'的有效值.

在运行5.2.4的不同服务器上使用完全相同的输入和XSD文件我没有错误,xml有效.

我已经尝试将minOccurs ="0"添加到元素中,我已经尝试指定nullable ="true",但仍然会得到错误.

更新:

看来我的服务器上使用PHP 5.2.4忽略了空值,并使用5.3.8拒绝了.我使用过的建议是使用两个定义的并集,一个用于整数类型,另一个用于null值:

XSD:

<xs:element name="clbburnfuelbias" minOccurs="0">
  <xs:simpleType>
    <xs:union memberTypes="data-fuelbias null-string"/>
  </xs:simpleType>
</xs:element>

<xs:simpleType name="data-fuelbias">
  <xs:restriction base="xs:integer">
    <xs:minInclusive value="-9900"/>
    <xs:maxInclusive value="9900"/>
  </xs:restriction>
</xs:simpleType>

<xs:simpleType name="null-string">
  <xs:restriction base="xs:string">
    <xs:length value="0"/>
  </xs:restriction>
</xs:simpleType>
Run Code Online (Sandbox Code Playgroud)

ace*_*ent 5

使元素可选(minOccurs="0")不会使其内容成为通配符.如果元素出现,则它必须与声明的类型匹配.

nillable="true"如果元素具有xsi:nil="true"属性,则使元素nillable()允许元素为空,其中xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance":

<clbburnfuelbias xsi:nil="true"></clbburnfuelbias>
<clbburntimebias xsi:nil="true"></clbburntimebias>
Run Code Online (Sandbox Code Playgroud)

您还可以使用联合类型,它仅具有相同的验证意义:

<xs:simpleType name="data-fuelbias">
  <xs:union>
    <xs:restriction base="xs:integer">
      <xs:minInclusive value="-9900"/>
      <xs:maxInclusive value="9900"/>
    </xs:restriction>
    <xs:restriction base="xs:string">
      <xs:length value="0"/>
    </xs:restriction>
  </xs:union>
</xs:simpleType>
Run Code Online (Sandbox Code Playgroud)