2015-01-15 20 views
1

我有一個模式(a),導入另一個模式(z)。 然後我有另一個模式(b)導入相同的模式(z)。多次導入相同的XSD是否是錯誤的?

發生這種情況時,符合模式(a)的XML文檔(d)也可以包含符合模式(z)的可選元素。

因此,當(d)在.NET中驗證時,我有一個例外:「simpleType'z:x'已經被聲明。」

但在氧氣中沒有例外。

我想配置.net它不會拋出此異常的方式。只是爲了表現得像氧氣。

怎麼樣?

回答

2

由於XSD建議允許(但不要求)符合規定的處理器忽略從已經遇到的名稱空間導入XSD,所以出現了這個問題。 .NET正在重新導入,因爲它被允許執行。氧氣是無視再進口,因爲它允許這樣做。

兩者都按照XSD建議書進行操作。看到最後一個音符在4.2.3 References to schema components across namespaces

注意:以上是字斟句酌所以相同的架構文檔的多個<import> ING不會構成違反條款 的Schema Properties Correct (§3.15.6)2,但應用程序 是允許的,確實受到鼓勵,不止一次地避免使用相同的模式 文檔來防止按組件建立身份組件的必要性。鑑於schemaLocation [屬性]只是一個提示,它是開放的應用程序,忽略所有 但對於一個給定的命名空間中的第一<import>,無論 實際值·的·schemaLocation的,但這樣的戰略風險失蹤 有用提供新的schemaLocations時的信息。

幸運的是,氧是基於Xerces的,它允許用戶通過

http://apache.org/xml/features/honour-all-schemaLocations

不幸的是控制此行爲,在.NET XML/XSD處理器不基於的Xerces ,並且我不知道任何.NET版本中的任何並行配置選項。 (我會很高興地更新這個答案,如果否則顯示)。

+0

確實,在.NET中沒有這樣的設置;而在氧氣中它什麼都不做。無論如何,你的回答幫助我理解了這個問題並分解了模式(z),以使從(a)和從(b)加載的類型永遠不會發生衝突。 我能夠這樣做,只是因爲我在本地緩存模式。如果我要上網獲取它們,那是不可能的。謝謝! –

相關問題