接觸XML有一段日子了,但一直都是複制粘貼,或者照着例子寫,沒有真正地了解。
今天,又溫習了一下XML,有種陌生又熟悉的感覺。。。
言歸正傳,先看一個簡單的schema檔案(05.xsd)
<a href="http://s3.51cto.com/wyfs02/M01/28/49/wKiom1N2-rDDc1m2AAJXx-6A0D0977.jpg" target="_blank"></a>
文法就不說了,這裡主要解釋一下schema元素的前三個屬性:
接下來,在看如何在xml文檔中引用這個schema檔案
<a href="http://s3.51cto.com/wyfs02/M02/28/49/wKiom1N2_gTzE-BeAAF_HoYEQ1A396.jpg" target="_blank"></a>
我當時有一個疑問:schema檔案中聲明的targetNamespace、xml文檔中的xmlns、xml文檔中引用的schema檔案的命名空間(即schemaLocation屬性中的寫的那個)這三者之間有什麼關聯呢?
後來,我發現schemaLocation中指定的命名空間要和這個被引用的schema檔案中聲明的targetNamespace相同,xml會在這個schema檔案中找這個指定的命名空間中所定義的元素規則。原來如此,這一點好了解,但是我試過在xml文檔中聲明的命名空間和它所引用schema時指定的命名空間不同也不能正确校驗。比如:上面這個例子中,我不寫xmlns或者将它寫成xmlns="http://www.example.org/08"都不能到達校驗的目的,總是有一個警告:No grammar constraints (DTD or XML schema) detected for the document.
經過一番思考,我終于想通了。關鍵在于定義schema檔案時targetNamespace屬性,這個屬性指明在這個schema檔案中定義的元素(注意:是定義的元素。對于上面的例子來說,name和birthday才是定義的元素,像element、complexType等不是這裡所說的定義的元素。)都來自targetNamespace所指定的這個命名空間。在xml文檔中引用了這個schema檔案,如何不定義命名空間或者聲明的命名空間和schema定義的元素的命名空間不同就無法驗證,xml文檔中元素在一個命名空間,而schema在另一個命名空間,不可能用A命名空間下的校驗規則去校驗B命名空間下的元素。例子中隻引入了一個schema檔案,其實可以引用多個的,這裡不作介紹。
接着,說一說在xml文檔中引入schema檔案
有兩個屬性是做這個事的:schemaLocation和noNamespaceSchemaLocation
noNamespaceSchemaLocation屬性引用沒有命名空間的schema檔案
schemaLocation屬性引用有命名空間的schema檔案
最後,附上幾種截圖
<a href="http://s3.51cto.com/wyfs02/M00/28/49/wKiom1N3CHqjvch7AAiKWSTLivk214.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M02/28/49/wKioL1N3CLSTNo9_AAMym-G-4QQ909.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M01/28/49/wKiom1N3CODRC6jfAAKQEJc8MBg383.jpg" target="_blank"></a>
小結:xml聲明的元素的命名空間要和被引用的schema檔案的命名空間相比對才能達到校驗的效果。
現在,回頭再看spring的配置檔案,有種莫名的喜悅。。。
<a href="http://s3.51cto.com/wyfs02/M01/28/49/wKiom1N3Crugr0jsAASIc9fTUTA641.jpg" target="_blank"></a>
本文轉自 手不要亂摸 51CTO部落格,原文連結:
http://blog.51cto.com/5880861/1412883