为什么我的XML失败XSD验证



我在一个服务器上验证失败的空值有点问题,但它在我所有其他服务器上都可以使用。该问题发生在较新的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':该值不是有效的值 原子类型的"数据燃料"。错误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>

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

制作元素nillable( 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>

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

我首选的方法是为可以包含整数的元素定义简单类型,或者什么都不是定义具有itemType = integer的列表类型,minlength = 0,maxlength = 1。我更喜欢与联合类型相比的主要原因是,它在架构意识XSLT和XQUERY中效果更好。对于某些数据绑定产品,它也可能更好。

数据需要是您在XSD中指定的值之间的整数。您正在传递一个空价值。至少...这就是应该验证的方式。我认为您所通过的XML不应根据模式进行验证。

也许XML解析器版本在PHP版本之间有所不同,并且较旧的版本是宽容的。无论哪种方式,我都会读到该模式的说法:这两个字段必须完全存在一次,并且必须包含X和Y之间的整数(其中X和Y在Minclusive and Maxinclusive中指定)。空值应失败验证。

最新更新