1.名称空间的概念
名称空间是W3C推荐标准提供的一种统一命名XML文档中的元素和属性的机制。使用名称空间可以明确标识和组合XML文档中来自不同标记词汇表的元素和属性,避免了名称之间的冲突。
1.1声明名称空间
名称空间声明的一般形式为:第一部分是一个关键字xmlns:,第二部分是名称空间的前缀,第三部分是一个等号,第四部分是双引号,将第五部分的名称空间标识URI包括起来。需要注意的是,名称空间的前缀不能为xml,因为在XML中这个字符串是保留作特殊用途的。例:
还可以隐式声明名称空间,即省略掉冒号和名称空间前缀。例:
1.2 使用名称空间
1.2.1 在XML文档中使用名称空间
在XML中,名称空间的使用涉及范畴的概念,范畴即名称空间的覆盖范围,它指的是哪些元素和属性在该名称空间中,哪些不在该名称空间中。名称空间既可以限定整个XML文档,也可以只针对XML文档中的一部分。
1.2.2示例:名称空间限定整个XML文档
<?xml version=”1.0”?>
<name>Tom</name>
<age>12</age>
<sex>male</sex>
</member_details>
|
1.2.3示例:名称空间只针对XML文档中的一部分
<?xml version=”1.0”?>
<member_details>
<age>12</age>
<sex>male</sex>
</member_details>
|
1.2.4示例:嵌套的名称空间
<?xml version=”1.0”?>
<name>Tom</name>
<age>12</age>
<newns:sex>male</sex>
</member_details>
|
此例中,除了元素sex被定义在新的名称空间中外,其余的元素仍然使用原来的名称空间。
1.3 在XML Schema中使用名称空间
1.3.1 Schema中的全局成分
全局成分指的是元素xsd:schema的直接子节点,包括元素声明、属性声明、复杂\简单类型定义、组定义、属性组定义。
1.3.2 Schema中的非全局成分
有时希望将非全局成分定义在目标空间中去,可使用下面方法。
<?xml version=”1.0”>
elementFormDefault=“qualified“>
|
属性elementFormDefault的默认值是unqualified,也就是规定了只有全局成分才被定义在目标名称空间中。将elementFormDefault的值赋为qualified,使得目标名称空间包含非全局的元素定义。同样,使属性attributeFormDefault的值赋为qualified,可使得目标名称空间包含非全局属性定义。如下:
<?xml version=”1.0”>
attributeFormDefault=“qualified“>
|
也可以修改属性form的值,使得某些非全局成分不包含在名称空间中。如下:
<?xml version=”1.0”>
elementFormDefault=“qualified“>
...
...
<xsd:complexType name=“cType“>
<xsd:sequence>
<xsd:element name=”name” type=”xsd:string” form=”unqualified”/>
…
|
2.一个XML Schema例子
下面的例子是一个XML Schema文件,名为"note.xsd"。
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">
<xsd:element name="note">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="to" type="xs:string"/>
<xsd:element name="from" type="xs:string"/>
<xsd:element name="heading" type="xs:string"/>
<xsd:element name="body" type="xs:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
|
3.一个与XML Schema相关联的XML文档
下面的XML文档和上文给出的XML Schema相关联,名为"note.xml"。并且下文的讨论将围绕这两个文档展开。
<?xml version="1.0"?>
<note xmlns="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3schools.com note.xsd">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
|
4.XSD-<schema>元素
<schema>元素是每个XML Schema的根元素:
<?xml version="1.0"?>
<xsd:schema>
...
...
</xsd:schema>
|
<schema>元素可以包含一些属性。一个schema声明通常如下所示:
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">
...
...
</xsd:schema>
|
我们重点来讨论关于名称空间的相关概念。
此片段:xmlns:xsd="http://www.w3.org/2001/XMLSchema",表明此schema中使用的元素和数据类型来自于"http://www.w3.org/2001/XMLSchema"名称空间(namespace)。它同样指出来自于"http://www.w3.org/2001/XMLSchema"名称空间的元素和数据类型必须使用带"xsd: "前缀。作为名称空间的标识符(在声明中作为元素或属性的前缀),这个前缀名是任意的,你也可以不使用xsd或xsi。这个 xmlns属性包含了基本的XML schema元素,比如element, attribute, complexType, group, simpleType等。
此片段:targetNamespace="http://www.w3schools.com",表明此schema (note, to, from, heading, body)定义的元素来自于"http://www.w3schools.com"名称空间。这个targetNamespace属性表示了该shema所对应的名称空间的URI。也就是说在引用该Schema的其它文档(包括自身文档)中要声明名称空间,其URI应该是targetNamespace的值。例如在这里因为要用到note.xsd自己定义的扩展数据类型(note, to, from, heading, body),所以也声明了名称空间xmlns="http://www.w3schools.com"。而且该名称空间是默认名称空间(没有前缀)。
我们再来看由该schema规定的XML文档note.xml的开头将是什么样子:
<note xmlns="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3schools.com note.xsd">
|
其中缺省名称空间声明xmlns="http://www.w3schools.com"就是和刚刚声明的XML Schema的名称空间相结合来规定该XML文档。(即该文档用到了此名称空间中定义的数据) xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 是任何XML实例文档固有的名称空间。而xsi:schemaLocation="http://www.w3schools.com note.xsd"则规定了该名称空间所对应的schema的位置,即在相同路径的note.xsd文件。
5.targetNamespace
xsd文件中定义了一个targetNameSpace后,其内部定义的元素,属性,类型等都属于该targetNameSpace,其自身或外部xsd文件使用这些元素,属性等都必须从定义的targetNameSpace中找。修改一下note.xsd,去除默认名称空间的声明,并添加一个复杂类型:
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
elementFormDefault="qualified">
<xsd:element name="note">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="to" type="xs:string"/>
<xsd:element name="from" type="xs:string"/>
<xsd:element name="heading" type="xs:string"/>
<xsd:element name="body" type="xs:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Student" type="stu"/>
<xsd:complexType name="stu">
<xsd:sequence>
<xsd:element name="Name" type="xs:string"/>
<xsd:element name="Class" type="xs:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
|
上述代码中,复杂类型stu是找不到的,因为你定义了一个名字空间"http://www.w3schools.com",该复杂类型存在于"http://www.w3schools.com"中,因此应该修改代码如下:
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns:student="http://www.w3schools.com"
elementFormDefault="qualified">
<xsd:element name="note">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="to" type="xs:string"/>
<xsd:element name="from" type="xs:string"/>
<xsd:element name="heading" type="xs:string"/>
<xsd:element name="body" type="xs:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Student" type="student:stu"/>
<xsd:complexType name="stu">
<xsd:sequence>
<xsd:element name="Name" type="xs:string"/>
<xsd:element name="Class" type="xs:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
|
若自身并不使用重用组件,仅供外部使用的话,则只定义targetNameSpace就可以,不用指定别名。
通过上面的例子,我们可以很深刻的理解targetNameSpace。targetNamespace定义了Schema定义的新元素与属性的名称空间。而"http://www.w3.org/2001/XMLSchema"名称空间则定义了element, attribute, complexType, group, simpleType等元素。
6. schemaLocation
schemaLocation 属性引用具有目标名称空间的 XML 架构文档(.xsd)。<xsi:schemaLocation="list of anyURI" >
该属性将具有目标名称空间的 XML 架构文档(.xsd)与实例文档(.xml)相关联。不要求 XML 架构有名称空间。
若要为没有目标名称空间的 XML 架构指定位置,请使用 noNamespaceSchemaLocation 属性。此属性中引用的 XML 架构不能有目标名称空间。因为此属性不接受 URL 列表,所以只能指定一个架构位置。
将具有目标名称空间的架构文档与实例文档相关联。可以列出多对 URI 引用,每一对都有不同的名称空间名称部分。
根据万维网联合会 (W3C) XML 架构建议,XML 实例文档可以同时指定 xsi:schemaLocation 和 xsi:noNamespaceSchemaLocation 属性。此外,还可以多次列出同一个命名空间。
以下示例显示如何使用 xsi:schemaLocation 属性为多个 XML 架构文档提供位置信息。
<p:Person
xmlns:p="http://contoso.com/People"
xmlns:v="http://contoso.com /Vehicles"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
<name>John</name>
<age>28</age>
<height>59</height>
<v:Vehicle>
<color>Red</color>
<wheels>4</wheels>
<seats>2</seats>
</v:Vehicle>
</p:Person>
|
7.noNamespaceSchemaLocation
noNamespaceSchemaLocation 属性引用没有目标名称空间的 XML 架构文档。
<xsi:noNamespaceSchemaLocation="anyURI" >
不要求 XML 架构有名称空间。若要为没有目标名称空间的 XML 架构指定位置,请使用 noNamespaceSchemaLocation 属性。此属性中引用的 XML 架构不能有目标名称空间。因为此属性不接受 URL 列表,所以只能指定一个架构位置。
以下示例显示如何对包含非限定元素的实例文档使用xsi:noNamespaceSchemaLocation 属性。
<person xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://adventure-works.com/schemas/person.xsd">
<name>John</name>
<height>59</height>
</person>
|
8.参考文献
[1] 吴洁,XML应用教程,清华大学出版社
[3]可重用元素的使用与命名空间,
[4]通过比较来理解Schema与WSDL中的targetNamespace属性,
分享到:
相关推荐
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:tool="http://www.springframework.org/schema/tool" targetNamespace=...
XML Schema,全称为XML Schema Definition,是用于定义XML文档结构和数据类型的规范,它是W3C(World Wide Web Consortium)制定的一种标准。在本实验"西工大服务计算实验2-1_XML Schema"中,你的任务是编写一个程序...
**XMLSchema库详解** XMLSchema(XML Schema)是一种用于定义XML文档结构和数据类型的规范,它为XML提供了形式化的语义定义。在Python编程环境中,有许多库用于处理XML,但`xmlschema`库是一个专门针对XML Schema的...
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> ``` 2. **元素定义**:XML Schema通过`<xs:element>`标签定义XML文档中的元素。例如,定义一个名为`name`的元素,用于描述人的姓名: ```xml <xs:...
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:complexType name="BookType"> <xs:sequence> <xs:element name="title" type="xs:string"/> <xs:element name="author" type="xs:string"/> ...
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:tool="http://www.springframework.org/schema/tool" targetNamespace=...
在这个例子中,使用`newInstance()`方法创建了一个新的`SchemaFactory`实例,指定的协议是`http://www.w3.org/2001/XMLSchema`,这是XSD的命名空间。 2. **Schema**: `Schema` 对象是根据XSD文件创建的,它包含了...
XmlSchema,全称为XML Schema Definition,是XML标准的一部分,用于定义XML文档的结构和数据类型。它是DTD(Document Type Definition)的替代品,提供了一种更强大、更灵活的方式来规范XML文档的内容和格式。在本...
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="book"> <xs:complexType> <xs:sequence> <xs:element name="title" type="xs:string"/> <xs:element name="author" type="xs:...
《使用dotnet-XmlSchemaClassGenerator从XMLSchema文件生成C#类》 在.NET开发过程中,处理XML数据是一项常见的任务。XML Schema(XSD)文件是定义XML文档结构和数据类型的规范,它允许我们对XML数据进行严格的约束...
1. **XML Schema基本概念**:了解XML Schema的基本组成,包括命名空间(Namespace)、元素(Element)、属性(Attribute)和数据类型(Datatype)。 2. **元素(Element)**:学习如何定义XML文档中的元素,包括...
"XML中的xmlns、xmlns:xsi和xsi:...在上面的代码中,xmlns="http://maven.apache.org/POM/4.0.0"定义了命名空间,xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"定义了XML schema实例,xsi:schemaLocation=...
目标命名空间(Target Namespace)是XML Schema中的一个关键概念,它用于区分不同来源的数据。声明目标命名空间并在XML数据文档中正确引用,可以防止元素名称冲突,确保不同Schema之间的互操作性。 课后实践部分,...
使用assembly插件打包jar后启动时,总是出现Unable to locate Spring NamespaceHandler for XML schema....错误,网上找了各种方法都没有用,在尝试了100+失败后,解决了这个问题,在打包的jar中,META-INF目录下,...
2. **命名空间(Namespace)**:在处理多个Schema时,命名空间可以避免元素和属性名称的冲突。通过使用前缀和URI,我们可以将元素与特定的Schema关联起来。 3. **复杂类型(Complex Type)**:复杂类型是包含一个或...
- 名称空间(Namespace)的概念:为了防止元素名称冲突,XML引入了名称空间,通过前缀和URI来唯一标识元素。 3. DTD(Document Type Definition)与XML Schema: - DTD:DTD是XML文档类型定义,用于定义XML文档的...
<xs:import namespace="http://www.w3.org/2001/XMLSchema" schemaLocation="common_types.xsd"/> </xs:schema> </wsdl:types> ``` 这里,`common_types.xsd`包含了一些通用的数据类型。 3. **导入命名空间**...
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="catalog"> <xs:complexType> <xs:sequence> <xs:element name="book" maxOccurs="unbounded"> ...