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.cnblogs.com/chnking/archive/2006/07/12/448849.html

XML Schema介绍之namespace

http://www.cnblogs.com/gzhnan/articles/1108442.html

还有w3school的

原文地址:https://www.cnblogs.com/ljzforever/p/1467792.html