2

我在一台服务器上的空值验证失败时遇到了一些问题,但它适用于我的所有其他服务器。该问题出现在较新的 PHP 版本 (5.3.8) 上,并且适用于稍旧的版本 (5.2.4)。

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

XML 输入:

<clbburnfuelbias></clbburnfuelbias>
<clbburntimebias></clbburntimebias>

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>

错误:

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

在运行 5.2.4 的不同服务器上使用完全相同的输入和 XSD 文件我没有收到任何错误,并且 xml 是有效的。

我尝试将 minOccurs="0" 添加到元素中,我也尝试指定 nullable="true" 但仍然出现错误。

更新:

使用 PHP 5.2.4 在我的服务器上似乎忽略了空值,并使用 5.3.8 拒绝了空值。我使用的一种解决方法是使用两个定义的联合,一个用于整数类型,一个用于空值:

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>
4

3 回答 3

5

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

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

<clbburnfuelbias xsi:nil="true"></clbburnfuelbias>
<clbburntimebias xsi:nil="true"></clbburntimebias>

您也可以使用联合类型,它仅用于验证目的具有相同的含义:

<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>
于 2012-11-05T18:05:24.163 回答
3

看起来旧版本的 PHP 有一个错误,该错误已被修复。这些元素实例显然是无效的。

我为可以包含整数或不包含整数的元素定义简单类型的首选方法是使用 itemType=integer、minLength=0、maxLength=1 定义列表类型。我更喜欢联合类型的主要原因是它在模式感知的 XSLT 和 XQuery 中工作得更好。它也可能对某些数据绑定产品更有效。

于 2012-11-05T19:43:57.037 回答
2

数据必须是您在 XSD 中指定的值之间的整数。您正在传递一个空值。至少......这就是它应该如何验证的方式。我认为您传递的 XML 不应该根据架构进行验证。

也许 PHP 版本之间的 XML 解析器版本不同,旧版本是宽容的。无论哪种方式,我读到该架构是这样说的:这两个字段必须只出现一次,并且必须包含 x 和 y 之间的整数(其中 x 和 y 在 minInclusive 和 maxInclusive 中指定)。空值应该无法通过验证。

于 2012-11-05T18:00:22.203 回答