2010-07-15 71 views
3

我有一個導入文件,需要跳過並繼續執行特定錯誤。我想忽略數據類型,最小/最大長度和必填字段的錯誤。我想要捕獲並顯示有關未正確格式化並且位置錯誤的項目的錯誤。驗證xml到xsd只捕獲特定錯誤

在這種情況下,該文件包含一組人。

我想趕上的是錯誤: 1:一個人節點外的子節點。 2:兒童節點外的孩子。 3:人的節點旁邊的人。

我想忽略錯誤: 1:孩子沒有名字。 2:人沒有出生日期。

<xs:element name="People"> 
<xs:complexType> 
    <xs:sequence> 
    <xs:element name="Person" minOccurs="1" maxOccurs="unbounded"> 
     <xs:complexType> 
     <xs:all> 
      <xs:element name="FirstName" minOccurs="1" maxOccurs="1"> 
      <xs:simpleType> 
       <xs:restriction base="xs:string"> 
       <xs:minLength value="1"/> 
       </xs:restriction> 
      </xs:simpleType> 
      </xs:element> 
      <xs:element name="LastName" minOccurs="1" maxOccurs="1"> 
      <xs:simpleType> 
       <xs:restriction base="xs:string"> 
       <xs:minLength value="1"/> 
       </xs:restriction> 
      </xs:simpleType> 
      </xs:element> 
      <xs:element name="BirthDate" type="Date" minOccurs="1" maxOccurs="1"/>    
      <xs:element name="Children"> 
      <xs:complexType> 
       <xs:sequence> 
       <xs:element name="Child" minOccurs="1" maxOccurs="unbounded"> 
        <xs:complexType> 
        <xs:all> 
         <xs:element name="FirstName" minOccurs="0" maxOccurs="1"> 
         <xs:simpleType> 
          <xs:restriction base="xs:string"> 
          <xs:minLength value="1"/> 
          </xs:restriction> 
         </xs:simpleType> 
         </xs:element> 
         <xs:element name="BirthDate" type="Date" minOccurs="1" maxOccurs="1"/>    
         </xs:all> 
        </xs:complexType> 
       </xs:element> 
       </xs:sequence> 
      </xs:complexType> 
      </xs:element> 
     </xs:all> 
     </xs:complexType> 
    </xs:element> 
    </xs:sequence> 
</xs:complexType> 

回答

0

更改您的架構如下:

  • 在以下的兒童的名字元素聲明,添加屬性,類型= 「XS:字符串」。另外,刪除元素聲明的所有內容(simpleType等)。如果需要,您可以使標籤自動關閉。
  • 在生日元素聲明,從1改變的minOccurs爲0

的第一個變化中刪除,因此目前放在孩子的名字,內容是至少一個字符長的限制。由於您正在移除元素類型的當前定義,因此添加type屬性是必需的。

第二個更改告訴驗證程序不需要出生日期。

進行那些更改和您要驗證的XML應該。

+0

謝謝,但我想離開這些項目。我想創建文件的人看到哪些字段是必需的。但是當他們嘗試導入文件時,我需要忽略一些項目。我遇到的問題是在驗證時調用的ValidationCallBack事件無法查看發生了什麼樣的錯誤。 所以我不想修改我的模式,但修改驗證回調方法,以便能夠讀取並確定正在拋出什麼錯誤,或者只有在我確定爲錯誤的錯誤上調用驗證回調災難性的。 – Irimis 2010-07-26 13:45:57

0

當出現無效輸入時,是停止還是繼續原則上完全是消費軟件的選擇,因此您所描述的內容在邏輯上是一致的,雖然可能有點不同尋常。如果您可以通過您使用的API獲取所需的信息,那麼沒有理由不讓軟件像您所描述的那樣運行,這可能是更好的選擇。 (但我不能幫你。)

如果你不能通過API獲得所需的信息(有些API會假設驗證只是一種是/否的事),一種可能的備選方案將使用ssamuel的答案中所述的弱化單獨模式進行驗證,以便唯一的驗證錯誤是您希望認爲是致命的錯誤。

也就是說:有兩種方法可以解決這個問題:(1)移動過去的想法,即必須始終放棄無效輸入:讓驗證器爲您提供更多信息,以便您可以決定停止或繼續。或者(2)超越這樣的想法:應用於文檔的所有處理的單個模式:使用一個模式來創建文檔,使用不同的模式來決定如何處理輸入。