2011-06-29 17 views
0

XSD文件中<element>minOccurs屬性的默認值爲1 (source)

考慮你有一個XSD指定一個包含2個元素的複合類型:<el1><el2>
如果您提供僅包含<el2>XDocument,則XDocument將不會生效。
相反,你會得到消息:
如何使用XSD檢查丟失元素的XML

The element Message in namespace ___ has invalid child element el2 in namespace ___. 
List of possible elements expected: el1

這基本上是<el2>錯誤,其中一個期望的複雜類型的錯誤不包含<el1>

我的問題是:
有沒有一種方法,以檢查是否所有<element>標籤都有效,其具有minOccurs> 0存在?
我會說這是使用XSD驗證XML時非常基本的檢查。

+0

我認爲它工作正常,但錯誤信息只是誤導。它說「這不是我期望看到的下一個元素」。如果你不喜歡這個消息,你的問題是你的驗證器,而不是你的模式。 – Nemo

+0

也許你是對的,但是當我錯過了minOccurs = 1的更多元素時,我只有第一個失蹤的錯誤。對用戶的反饋一次報告1個缺失元素效率不高。 @Nemo:瞭解其他驗證器嗎? – Peter

回答

2

根據您定義架構的方式,元素的外觀順序很重要。

在這種情況下,驗證期待一個<EL1>但看到元素<EL2>因此錯誤是<EL2>正在出現的地方不應該。我相信這意味着在定義複雜類型時使用了「序列」。所以你得到的錯誤是正確的。

如果這仍然困擾你,並且元素的順序與你的解析無關,使用「all」而不是「sequence」,這將不會強制執行順序。然後驗證程序應該提示您缺少必需的元素<el1>。它應該看起來像這樣:

<xsd:complexType name="MyType"> 
    <xsd:all> 
    <xsd:element name="el1" minOccurs="1"/> 
    <xsd:element name="el2" minOccurs="1"/> 
    </xsd:all> 
</xsd:complexType> 

我希望這有助於。

+0

你是對的,這裏是問題的序列。不幸的是,XSD是由第三方提供的,我們並不喜歡改變它... – Peter

+0

@peter我很擔心這一點,但至少你知道驗證器沒有損壞。 – Rob