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

时间:2012-11-05 17:45:46

标签: php xml validation 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':该值不是有效值   原子类型'data-fuelbias'。错误1824:元素   'clbburntimebias':该值不是原子类型的有效值
  '数据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>

3 个答案:

答案 0 :(得分:5)

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

如果元素具有nillable="true"属性,则{@ 1}}

允许元素为空(xsi:nil="true")允许该元素为空
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

数据需要是您在XSD中指定的值之间的整数。您传递的是空值。至少......这应该是如何验证的。我认为您传递的XML不应该根据模式进行验证。

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