schema中import與include的區別

導入、包含和 可變式效果

許多 Java 項目都涉及多個不同的類和程序包,而不只是一個大的 Java 文件,這是因爲模塊化可以方便代碼的重用、讀取和維護。隨後,必須將必需的導入語句加入到類中,然後才能使用它們。同樣,在 XML 模式中,您必須在各種不同命名空間中管理不同的模式,並需要將必需的導入語句加入到模式中,然後才能使用它們。

可以使用 <import/> 和 <include/> 模式結構組裝 XML 模式,當然,以下應是該模式中位於其他任何聲明之前的第一個語句:

<schema>
<import namespace="foo" schemaLocation="bar.xsd" />
<include schemaLocation="baz.xsd" />
 
...
</schema>

當導入的模式具有 targetNamespace 時,將使用 <import />,而當包含的模式未聲明 targetNamespace 時,將使用 <include />。

下面,我們將介紹一個示例,該示例涉及兩個模式 A 和 B,且 A 引用 B 中聲明的項目。

情況 I
如果兩個模式都有 targetNamespace,且模式 A 的 targetNamespace (tnsA) 不同於模式 B 的 targetNamespace (tnsB),則 A 必須導入 B。

<import namespace="tnsB" schemaLocation="B.xsd">

但 A 導入 B 時和 A 包含 B 時不指定命名空間是一個錯誤。

情況 II
如果兩個模式都包含 targetNamespace,且模式 A 的 targetNamespace (tnsAB) 與模式 B 的 targetNamespace (tnsAB) 相同,則 A 必須包含 B。

<include schemaLocation="B.xsd">

A 導入 B 是錯誤的。

情況 III
如果模式 A 和 B 都沒有 targetNamespace。這種情況下,A 必須包含 B。

<include schemaLocation="B.xsd" />

情況 IV
如果模式 A 沒有 targetNamespace,而模式 B 包含 targetNamespace (tnsB),則 A 必須導入 B。
<import namespace="tnsB" schemaLocation="B.xsd" />

A 包含 B 是錯誤的,這是因爲 B 包含一個 targetNamespace。

情況 V
如果模式 A 包含 targetNamespace (tnsA),而模式 B 不包含 targetNamespace,情況又將如何?A 應包含 B。但如果我認爲在本例中,A 應導入 B,情況將如何?實際上,在這種情況下,A 可以導入或包含 B,且這兩個操作都是合法的,但效果並不相同。

如果 A 包含 B,則所包含的來自 B 的所有項目將獲取 A 的命名空間。這樣的包含被稱作 可變式 包含。

如果您不希望發生這樣的可變式效果,則必須在不指定命名空間情況下完成導入。沒有 namespace 屬性的導入允許對不包含目標命名空間的組件進行非限定性引用。

<import schemaLocation="B.xsd">

多次導入或包含一個模式不會產生錯誤,這是因爲模式處理器可以檢測這種情況並不再加載已加載的模式。因此,A.xsd 導入 B.xsd 和 C.xsd 並不產生錯誤;B.xsd 和 C.xsd 各自單獨導入 A.xsd。循環引用不會產生錯誤,但強烈建議您不要使用它。

順便說明的是,一個類似 <import /> 的簡單導入也是合法的。該方法只允許對不包含目標命名空間的外部組件進行非限定性引用,而不提供任何有關其所在位置的信息提示。模式處理器將利用某種機制提示出錯或查找未知項目,因模式處理器而異。但使用 <include /> 是非法的。

經驗法則:


<include/> - 它的作用與在包含模式中以內聯方式定義被包含的模式相當。
<import/> -如果被導入的模式與導入模式的 targetNamespace 不同則始終使用 <import/>。
發佈了23 篇原創文章 · 獲贊 19 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章