2010-10-20 132 views
1

1)我認識到命名空間是區分使用XML模式指定的不同模式/詞彙表的一種方式,但我不明白爲什麼命名空間(模式正在開發詞彙表)是一個好主意,在模式本身內指定(通過targetNamespace屬性)。Xml模式命名空間

a)如果我們能夠將特定名稱空間與實例文檔中的特定詞彙表/模式關聯起來,會不會更好?這樣,那些編寫實例文檔就可以完全自由地將模式與任何他們想要的名稱空間名稱關聯起來?!

b)我在指定目標名稱空間的模式中看到的好處是,它的創建者可以選擇將文檔放在名稱空間的末尾,以描述該名稱空間的元素(假定架構使用URL作爲名稱空間) 。還有其他好處嗎?

2)如果架構沒有targetNamespace,則必須使用noNamespaceSchemaLocation屬性而不是schemaLocation屬性(在實例文檔中)引用特定架構。

如果文檔實例只是指定模式的位置並讓XML模式驗證程序判斷模式是否指定了targetNamespace,那麼這樣做會不會更簡單?

謝謝

+1

術語「XML Schema」僅指模式描述語言。個別模式被簡單地稱爲「模式」或「模式」。 – 2010-10-21 17:24:16

回答

1

你的想法命名空間的「後期綁定」是不壞,但目前的命名空間的目的之一就是讓處理器弄清楚要使用的架構。

在這個過程中,「schemaLocation」屬性只是一個提示,很多時候根本沒有用處。

考慮以下情形:

  • 我對JMS接收XML消息
  • 我有可能需要應用幾種可能模式;將模式中的URL硬編碼到XML文檔本身不起作用,因爲在這種情況下我無法移動環境。
  • 處理器使用XML文件中元素的名稱空間在內存模式緩存中查找模式。

在這種情況下,您可以說「讓應用程序維護從命名空間到模式的映射,但模式本身內部沒有指定名稱空間的原因。不幸的是,當一個模式混合多個名稱空間和導入時,這會導致問題。根據您選擇的XML文件,您可能會在模式中創建名稱衝突。

希望這是有道理的。

+0

「•處理器使用XML文件中元素的命名空間在內存模式緩存中查找模式。在這種情況下,你可以說「讓應用程序維護從命名空間到模式的映射,命名空間在模式本身內部沒有任何理由」;「我想象在a中描述的實現)對於這種場景是完美的假設我們能夠在運行時通知處理器它應該映射哪個Xml Schema元素的名稱空間? – user437291 2010-10-21 19:35:26

+0

「不幸的是,當架構將多個名稱空間與導入混合在一起時,會導致問題。根據您選擇的XML文件,您可能會在模式中創建名稱衝突。「 我想即使使用a)中描述的實現,問題也可以解決? – user437291 2010-10-21 19:35:49

2

我知道XML Namespaces只有一個定義,並且在http://www.w3.org上也有一個XML Schema定義的定義。由於XML Schema非常複雜,因此決定了XML Schema Part 0: Primer Second Edition,XML Schema Part 1: Structures Second EditionXML Schema Part 2: Datatypes Second Edition三部分中的標準。

如果你知道更多XML Namespaces和XML Schema的定義(更多「詞彙表」),請發佈你定義的鏈接。

targetNamespace在任何模式的根目錄中的含義很容易清楚。XML不是一種語言。它是一種元語言。 XML Schema幫助我們定義一種語言。我們必須爲我們定義的語言(模式)提供一個唯一的名稱。它是模式的targetNamespace。所以它的某些文件應該被解釋爲用美國英文寫成的文件,在GB英文中可能不太正確。

因此,模式中的targetNamespace是唯一的,在XML文件中聲明瞭元素的名稱空間,這意味着我們以寫入文檔的確切語言(和方言)的方式進行定義。你也可以非常精確地說出相應名稱應該被解釋的上下文。

如果定義了一個沒有targetNamespace的模式,意味着來自XML文檔的相應元素和屬性也必須屬於「no namespace」。 noNamespaceSchemaLocation屬性或schemaLocation屬性的用法是不是必需的。所以你你一定不要引用XML文檔中的模式。在這種情況下,XML文檔的讀者應該從相應的上下文中瞭解您的意思。

在你的問題的最後,你問

,那豈不是更簡單的,如果不是 文檔實例只會指定 XML模式的位置,讓 Xml架構驗證弄清楚 是否不是架構指定 targetNamespace?

noNamespaceSchemaLocation屬性的值恰好是定義所用模式的XSD文件的路徑。 schemaLocation屬性的值是名稱空間,XSD文件的路徑被空白分隔。所以屬性已經完成了你的建議。

1

指定目標名稱空間的單個模式(或「詞彙表」)的好處是,它允許模式從其他名稱空間重用模式。

最常使用的模式是http://www.w3.org/2001/XMLSchema,它定義了像xs:intxs:string這樣的內置類型。例如SAML Assertion重用http://www.w3.org/2000/09/xmldsig#http://www.w3.org/2001/04/xmlenc#

如果每個實例文檔在不同的命名空間中定義了xs:int,那將是非常令人困惑的。像xs這樣的前綴可以由實例指定爲任意值,所以如果需要,可以將其稱爲foo:int。但驗證者需要知道最終它解析爲{http://www.w3.org/2001/XMLSchema}int

+0

「指定目標名稱空間的單個模式(或」詞彙表「)的好處是它允許模式從其他名稱空間重用模式。」「但驗證程序需要知道最終它會解析爲{http:///www.w3.org/2001/XMLSchema}int「 但是,即使Xml命名空間和Xml Schema與a)中描述的方式相關聯,也無法實現這兩個目標? – user437291 2010-10-21 19:37:01