我在一个服务器上验证失败的空值有点问题,但它在我所有其他服务器上都可以使用。该问题发生在较新的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中指定)。空值应失败验证。