xml的schema命名空間之研究
先放下將要進行說明的例子:
data.xml
<?xml version="1.0"?>
<root xmlns="www.ljzforever.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="www.ljzforever.com xsd.xsd">
<emp>
<id>1</id>
<name>ljz1</name>
</emp>
<emp>
<id>2</id>
<name>ljz2</name>
</emp>
<emp>
<id>3</id>
<name>ljz3</name>
</emp>
<emp>
<id>4</id>
<name>ljz4</name>
</emp>
</root>
xsd.xsd
<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="www.ljzforever.com"
elementFormDefault="qualified">
<element name="root">
<complexType>
<sequence>
<element name="emp" maxOccurs="unbounded">
<complexType>
<sequence>
<element name="id" type="int" />
<element name="name" type="string" />
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
先講schema
xmlns="http://www.w3.org/2001/XMLSchema"
其實還有另一種寫法
<xs:schema xmlns:xs=http://www.w3.org/2001/XMLSchema
我在這里倫了個懶,把它作為了默認的命名空間,如果按照下面的一種寫法,就需要在每個schema標簽前都加上xs:
這是固定語法
targetNamespace="www.ljzforever.com"
表示在schema所定義的標簽應作用于哪一個命名空間下。應用此schema的xml文件中如果有部分或全部標簽想受此schema的控制,標簽前必須使用此命名空間。
里面的www.ljzforever.com其實可以隨便寫,寫abc都行
elementFormDefault="qualified"
有兩個值:qualified和unqualified
首先要知道:運用了schema中聲明的元素或者類型的Xml標簽只能歸到兩個命名空間中的某一個去,這兩個是,無名命名空間和由targetSchema屬性指明的目標命名空間。
如果該值是 unqualified,實例xml的根元素必須有命名空間的的限定,這個命名空間必須是schema中定義的targetNameSpace。但是其下子元素無須也不允許用命名空間前綴限定目標命名空間。 子元素的命名空間為空命名空間。
如果該值是 qualified,實例xml根元素及其下所有子元素都必須通過命名空間前綴限定目標命名空間。這個命名空間必須是schema中定義的targetNameSpace。
說的很拗口啊,我來解釋一下,這個屬性與targetNameSpace相關
前面不是說了一個schema只對特定命名空間下的標簽起作用,
如果是qualified,則使用此schema的xml的每個標簽必須使用此命名空間,因為我在前面使用的默認的命名空間,所以不需要在每個標簽的前面加上命名空間前綴
如果是unqualified,則是只能在根標簽上使用此命名空間,且子標簽不能使用此命名空間,使用別的命名空間是可以的。但是起不到驗證作用。
我不太明白為什么要弄個起不到驗證作用的unqualified參數,反正我用的一般都是qualified
下面再來談談xml文件的
xmlns="www.ljzforever.com"
里面的值必須和targetNameSpace內定義的一樣,我是倫了個懶,寫成了默認的命名空間,如果寫成一般的,則需要在所有子標簽前加上命名空間前綴
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
固定寫法,沒什么好說的
xsi:schemaLocation="www.ljzforever.com xsd.xsd">
固定寫法,值由兩部分組成,空格前面是與targetNameSpace內定義的一樣,后面是xsd文件路徑,因為我把它們放在了同一目錄下,所以沒有寫很多路徑
講了這么多,其實你一定覺得這個命名空間很麻煩,其實xml也提供了無命名空間的解決方案:
data.xml
<?xml version="1.0"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xsd.xsd">
<emp>
<id>1a</id>
<name>ljz1</name>
</emp>
</root>
xsd.xsd
<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<element name="root">
<complexType>
<sequence>
<element name="emp" minOccurs="1" maxOccurs="unbounded">
<complexType>
<sequence>
<element name="id" type="int" />
<element name="name" type="string" />
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
只不過把xsi:schemaLocation改成xsi:noNamespaceSchemaLocation,而后面直接跟文件路徑,而不用寫命名空間!
如果采取這種方式,xml文件中可以采用任意命名空間,或者不用,但是要注意保持一致:要用就用一樣的,要么就都不用!
以下是我所參考的文章:
Schema中elementFormDefault="qualified"所起的作用
http://blog.csai.cn/user1/15907/archives/2007/16440.html
XSD schema文件中elementFormDefault 屬性探討
http://www.rzrgm.cn/chnking/archive/2006/07/12/448849.html
XML Schema介紹之namespace
http://www.rzrgm.cn/gzhnan/articles/1108442.html
還有w3school的

浙公網安備 33010602011771號