2012-11-05 75 views
2

我有一點空值的一臺服務器上驗證失敗的問題,但它的作品我的所有其他服務器上。這個問題發生在一個更新的PHP版本(5.3.8)上,並且適用於稍舊的版本(5.2.4)。爲什麼我的xml無法通過XSD進行驗證?

這裏有幾個其中失敗隔離元件的:

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> 

錯誤:

Error 1824: Element 'clbburnfuelbias': The value is not a valid value of the atomic type 'data-fuelbias'. Error 1824: Element 'clbburntimebias': The value is not a valid value of the atomic type
'data-timebias'.

使用的確切小號ame輸入和運行5.2.4的不同服務器上的XSD文件我沒有遇到任何錯誤,並且xml有效。

我曾嘗試加入的minOccurs =「0」的元素,我已經試過指定可空=「真」,以及,但仍然得到了錯誤。

UPDATE:

看來,空值,則使用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> 

回答

5

製作元素可選(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> 
+0

謝謝你的回答。我認爲不應該允許使用該模式的空值,但奇怪的是它在其他版本的PHP上工作。僅供參考我已經更新了我的答案,以包含格式正確的聯合聲明。謝謝! –

2

的數據需要是您在XSD中指定的值之間的整數。您正在傳遞一個空值。至少...這是應該如何驗證。我認爲你傳遞的XML不應該根據模式進行驗證。

也許XML解析器版本是PHP版本之間的不同,與老版本是寬容。無論哪種方式,我讀該模式如說:兩個場必須存在恰好一次,並且必須包含x和y(其中x和y在minInclusive和maxInclusive,便會被指定)之間的整數。一個空值應該驗證失敗。

3

看起來像老版本的PHP有一個bug已被修復。這些元素實例顯然是無效的。

我的優選定義可以包含一個整數或任何元件的簡單型的方式是定義與ITEMTYPE =整數,的minLength = 0,最大長度= 1列表類型。我更喜歡使用union類型的主要原因是它在架構感知的XSLT和XQuery中更好;它也可能對一些數據綁定產品更好。

+0

現在這是一個非常好的功能。我不知道整數可能有一個零「minLength」。 – acelent

+0

我剛剛重讀你的答案,現在我看到你正在建議一個列表類型。這很有道理,數據綁定可能會將這樣的字段實現爲0或1個元素的整數列表。但仍然比可以是整數或空字符串的字段更好。 – acelent