2012-01-12 82 views
1

我正在處理第三方XML文件並根據第三方提供的xsd進行驗證。他們的xsd是不完整的(imo)。例如,他們有一個屬性定義如下:使用兩個xsd文件驗證文件單個XML屬性?

<xsd:attribute name="debit_flag" type="string_1" use="required"></xsd:attribute> 

但它只能有值「1」或「0」:

<xs:element name="debit_flag_type"> 
    <xs:simpleType> 
    <xs:restriction base="xs:string"> 
     <xs:enumeration value="1"/> 
     <xs:enumeration value="0"/> 
    </xs:restriction> 
    </xs:simpleType> 
</xs:element> 

我無法改變自己的XSD(因爲它們可能在將來更新它),所以我可以添加第二個xsd模式,從中我可以添加額外的檢查,並會有一個主要的開銷?

感謝, 帕特里克

+1

屬性類型「string_1」和元素「debit_flag_type」之間的關係是什麼?對不起,我沒有看到連接。 – 2012-01-12 15:53:53

回答

1

你最好的選擇是,一如既往,以通知不一致的第三方在其架構。畢竟,如果他們在將數據發送給您之前使用該模式驗證其數據,則無法擴展數據,因爲數據類型保證與模式中的(有限)定義相同。

但是,XML模式定義允許導入模式。你可以做的是編寫你自己的XSD,使用<xsd:import />來導入第三方的模式。不幸的是,它取決於導入的XSD中的定義是否確實可以覆蓋它們。換句話說,即使在這種情況下,您的選擇也是有限的。

根據兩種不同的模式測試您的輸入數據:我不會這樣做。如果你的模式擴展了定義(即允許更多),那麼它在所有情況下都是無用的。如果它是一個縮小的定義,它可能會有好處,但只適用於您自己的應用程序。

+0

嗯,以爲它會是這樣的。不幸的是,我有一個測試人員告訴我,我必須正確驗證數據,另一個企業需要在他們的頭腦中考慮更重要的事情......我會將額外的檢查添加到代碼中。謝謝。 – Patrick 2012-01-12 15:20:40

+0

@帕特里克:測試者是對的,但是,如果他們自己也使用XSD,公司也會受其限制。一般來說,在數據交換的情況下(假設情況如此),發送方和接收方都應驗證數據。如果發件人使用企業XSD進行驗證並且您使用另一個驗證,則可能會遇到有問題的情況。 – Abel 2012-01-12 16:35:33