`
ChuanSu
  • 浏览: 53321 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

详解XML namespace

    博客分类:
  • XML
阅读更多
XML Namespaces

首先来看下,为什么要引入 Namespaces 这个概念,明白了这个,我们再来一步一步挖掘 namespaces。
来看个简单的例子
<?xml version="1.0"?>
<Person>
	<Name>Tom</Name>
	<Address>
		<Street>XinHua .7</Street>
		<City>BeiJing</City>
	</Address>
</Person>

记录了一个人的基本信息,名字,家庭地址
<?xml version="1.0"?>
<Contact>
	<Address>Tom@hotmail.com</Address>
	<Tel>010-123123123</Tel>
</Contact>

记录了一个人的联系方式,电子邮箱,电话号码

可以看到,第一个xml文件存在一个 Address Element Type
第二个xml 文件同样存在一个 Address Element Type。当然如果这两个Element Type都是单独存在的话,就像上面这样,各自存在与不同的xml document当中,是完全没有问题的。

可是假如,想要对一个人做记录,其中包括名字,地址,联系方式。
<?xml version="1.0"?>
<Person>
	<Name>Tom</Name>
	<Address>
		<Street>XinHua .7</Street>
		<City>BeiJing</City>
	</Address>
	<Contact>
	    <Address>Tom@hotmail.com</Address>
	    <Tel>010-123123123</Tel>
    </Contact>
</Person>

那么程序如何分得清楚第一个Address Element Type代表的是家庭地址,而第二个则代表的是邮箱地址。不单是这个例子,假如图书馆想要对借书的人与被借走的书做个record的话,不单是Person这个Element Type 有<Name></Name>,Book同样有<Name></Name>这样的Element Type。所以这就需要引入Namespace这个重要的概念
引用
XML namespaces were originally designed to provide universally unique names for elements and attributes.
Namespace是为elements和attributs提供独一无二的Name,来避免发生上面例子当中的命名冲突。所以上面的例子可以写为
<?xml version="1.0"?>
<Person>
	<Name>Tom</Name>
	<addr:Address xmlns:addr="http//www.google.com/address">
		<addr:Street>XinHua .7</addr:Street>
		<addr:City>BeiJing</addr:City>
	</addr:Address>
	<cont:Contact xmlns:cont="http//www.google.com/contact">
	    <cont:Address>Tom@hotmail.com</cont:Address>
	    <cont:Tel>010-123123123</cont:Tel>
    </cont:Contact>
</Person>


上面知道了Namespace的作用是为elements和attribute命名的,而命名方式是Two-Part Naming System,又叫做expanded name即是 local name + Namespace name。所以对与任何一个element type 和 attribute 的名字都是由 local name+ Namespace name构成的。来看下W3对local name 和 Namespace name 是怎样定义的
引用
For a name N in a namespace identified by a URI I, the namespace name is I. For a name N that is not in a namespace, the namespace name has no value.In either case the local name is N.

举个例子
<?xml version="1.0"?>
<addr:Address xmlns:addr="http://www.google.com/address">Xinhua.7</addr:Address>

对于Element type Address而言,它属于"http://www.google.com/address"这个namespace,所以它的namespace name就是"httto://www.google.com/",local name就是Address
<?xml version="1.0"?>
<Address>Xinhua.7</Address>

对于Element type Address而言,因为没有declare任何namespace,所以它不属于任何namespace,所以它的namespace name是has no value的,但是local name仍然是 Address。

判断XML中的两个Element type 或者两个attribute是否相同时,不但要看local name是否一致,还要判断它们的namespace name 是否相同,辨别namespace name是否相同,则要看URI reference 是不是一致,URI reference 是一系列的字符即字符串,当且仅当字符串内的每一个字符都是一致的时候,才能说URI reference是相同的。
(注意,一般URL reference用普通的URL表示就可以了,这个URL只是个identifier 标识符,并不要求可以 access any resource(并不要求可以到达指定的位置)。

上面定义中分了两种情况,一种是Name N(注意每当提到XML Name的时候,都是指XML中Element type的名字或者Attribute的名字) is in a namespace,另一种是is not in a namespace。可是又怎样区分一个NAME是否属于某个namespace呢,需要先来看下XML是怎样声明一个namespace

引用
A namespace (or more precisely, a namespace binding) is declared using a family of reserved attributes. Such an attribute's name must either be xmlns or begin xmlns:.


W3中明确说明,只有两种方式可以声明一个namespace
xmlns="......."
xmlns:NAME="......"
这两个keyword都是attribute name,统称为NSAttName。 和
<?xml version="1.0"?>
<Person name="Tom"/>
中的属性name是一样的道理。
xmlns叫做 DefaultAttName,xmlns:NAME(此处的NAME可以是任何字符)叫做PrefixedAttName。
每当谈到一个attribute的时候,都应该想到attribute name和attribute value 例如上面的name是attribute name的名字(更准确的说,是attribute name的local name),"Tom"则是attribute value。
而对于属性 xmlns 或者 xmlns:NAME,它们的attribute value必须是URI reference或者空的字符串“”
<?xml version="1.0"?>
<Address xmlns="http://www.google.com/address"/>


<?xml version="1.0"?>
<Person xmlns:ns="http://www.google.com/person"/>

这两种方式,分别声明了名字(namespace name)为“http://www.google.com/address"的namespace 和名字为"http://www.google.com/person"的namespace。

这两种声明方式有很大的区别,区别主要在与:对Element type和attribute的作用不同,先来看 PrefixedAttName
xmlns:NAME,这个Name的作用是给namespace加了个前缀(give namespace a prefix),这个前缀是用来联系XML中的Element type 和 Attribute。例如
<?xml version="1.0"?>
<ns:Person xmlns:ns="http://www.google.com/person"/>

ns:Person,表明,Element Type Person 属于名字为“http://www.google.com/person"的namespace(Person is in this namespace) 那么对于Element type Person的namespace name 是"http://www.google.com/person/",local name是 Person.
对于下面的代码
<?xml version="1.0"?>
<Person xmlns:ns="http://www.google.com/person"/>
只能表示,声明了一个namespace,但是Element type:Person并不属于这个namespace。既然此处的person也没有被其他namespace的prefix限定,那么它的namespace name是has no value的。再重复一遍,不管这个Person属于不属于这个namespace 它的local name都是 Person。


仅仅知道如何声明namespace和如何将一个element type 或者 attribute加入到某个namespace还是不够的,还需要了解 namespace 的 scope (范围)
引用
The scope of a namespace declaration declaring a prefix extends from the beginning of the start-tag in which it appears to the end of the corresponding end-tag, excluding the scope of any inner declarations with the same NSAttName part. In the case of an empty tag, the scope is the tag itself.


意思是说,当用PrefixAttName的方式在一个Element的start-tag中声明的namespace,namespace的作用范围包括本身及所有的children,除去那些又被其他namespace 的prefix 覆盖了的element。(假如在xml文件的root element的start-tag中声明Prefix的namespace,那么这个prefix可以作用与整个xml document)
举个例子
<?xml version="1.0"?>
<addr:Address xmlns:addr="http//www.google.com/address"
	          xmlns:cont="http//www.google.com/contact">
		<addr:Street>XinHua .7</addr:Street>
		<addr:City>BeiJing</addr:City>
	    <cont:Address>Tom@hotmail.com</cont:Address>
	    <cont:Tel>010-123123123</cont:Tel>
</addr:Address>
注意可以在一个element的start-tag当中声明多个namespace,但是声明的方式必须是PrefixAttName,即xmlns:Name="....."。所声明的namespace的prefix可以不在当前的element中使用,甚至不用都可以。
可以看出 带有前缀cont的namespace是在Address的start-tag中声明的,但是前缀cont却在子元素中使用,同样,表示子元素的Element type Address与Tel 属于名字为“http://www.google.com/contact"的namespace。

再来看下Default namespace的作用范围
所谓Default namespace 即是用DefaultAttName声明的namespace,xmlns="...."
引用

The scope of a

default namespace declaration extends from the beginning of the start-tag in which it appears to the end of the corresponding end-tag, excluding the scope of any inner default namespace declarations. In the case of an empty tag, the scope is the tag itself

对于Default namespace的声明,其作用范围和 Prefix namespace声明 是一样的,但是需要注意的是以下几点
引用
A default namespace declaration applies to all unprefixed element names within its scope. Default namespace declarations do not apply directly to attribute names; the interpretation of unprefixed attributes is determined by the element on which they appear.

1,Default namespace的声明,在其作用范围之内,对所有的unprefixed element type(无前缀的元素)都有 默认将其添加到此namespace的作用,也就是说 如果在一个element的start-tag当中以 xmlns="...."方式声明了一个namespace,那么其当前元素及其子元素的所有的unprefixed element type都是属于这个namespace的。
再重复一遍,既然这些unprefixed element type都属于这个namespace,那么他们的namespace name就是这个URI,local name当然还是自己了。

2,Default namespace的声明,在其作用范围之内,对所有的 unprefixed attribute是没有直接作用的,也就是说在这个作用范围之内的无前缀的attribute 并不属于这个默认的namespace,所以它们的namespace name是no value的,local name仍然是自己本身。
例如
<?xml version="1.0"?>
<Address xmlns="http//www.google.com/address">
		<Street number="7">XinHua</Street>
		<City>BeiJing</City>
</Address>

Element type Address,Street,City都是属于名字为"http://www.google.com/address"的namespace,但是 在element street中的属性number并不属于这个namespace。number的namespace name has no value,local name is number。

这时候,你肯定会想,假如我不想让其中的一个Element type属于这个默认的namespace,该怎么办。
在上面提到 对与attribute,xmlns或者xmlns:Name,他们的attribute value必须是URI或者是空字符“”,这里就用到了
<?xml version="1.0"?>
<Address xmlns="http//www.google.com/address">
		<Street number="7">XinHua</Street>
		<City xmlns="">BeiJing</City>
</Address>

可以在一个element的start-tag中声明 xmlns="",可以将此element及所有的子元素都跳出这个默认的namespace,当然对于Element type City来讲 它的namespace name是 has no value的,其local name 仍然是 City。


Qualified Name

Qualified Name 分为两种

PrefixedName(有前缀)
UnPrefixedName(无前缀)

PrefixedName 格式是 Prefix:LocalName
UnPrefixedName 格式是 LocalName
注意此处的Prefix 并不是任何形式的字符都可以,Prefix必须是bound(附于)namespace 的前缀,即xmlns:Prefix="....."

Qualified Name 有两种不同的体现形式,一是在Element Type的体现
<?xml version="1.0"?>
<bk:Book xmlns:bk="http//www.google.com/book" price="500">
		<bk:Title>I have a dream</bk:Title>
</bk:Book>

对于Element type Book,它的qualified name 是 bk:Book,
local name 是Book。
Element type Title,qualified name 是bk:Title
local name 是Title
二者的namespace name都为“http//www.google.com/book"
<?xml version="1.0"?>
<Book price="500">
		<Title>I have a dream<Title>
<Book>
此处的 Element Type Book 的 qualified name是 Book
local name 是 Book
Element Type Title 的 qualified name是 Title
local name 是 Title
二者的namespace name 都是没有值的,has no value。

Qualified Name另一种体现形式 是在 Attribute 上的体现

首先来看下XML中 Attribute的格式

1,NSAttName=Attribute Value
2,Qualified Name=Attribute Value

NSAttName,上面已经说过是xmlns与xmlns:NAME的统称。
第一种格式 主要体现在 声明namespace(Namespace declaration)上。
注意 xmlns,xmlns:NAME可以作为attribute name  但是attribute value必须是 URI reference或者Empty String (xmlns:Name=URI/xmlns="")
<?xml version="1.0"?>
<bk:Book xmlns:bk="http://www.google.com/book" bk:price="500">
		<bk:Title bk:language="English">I have a dream</bk:Title>
</bk:Book>
对于Attribute price,其qualified name 是 bk:price
local name是price
当然value 是 500
对于 Attribute language 其qualified name 是 bk:language
local name 是 language
二者的namespace name 是 “http://www.google.com/book"

最后需要注意的是 namespace name,local name,qualified name 都是针对 Element Type(Element Name) 或者 Attribute 而言的。
分享到:
评论

相关推荐

    python xml命名空间

    ### Python XML命名空间详解 在处理XML文档时,命名空间(Namespace)的使用十分常见,尤其是在需要合并多个来源的数据或确保元素唯一性的情况下。本文将详细介绍Python中如何处理XML命名空间,包括理解命名空间的...

    XPath语法详解xml开发必备

    - **节点**:XML文档由一系列节点构成,如元素(element)、属性(attribute)、文本(text)、命名空间(namespace)、处理指令(processing instruction)和注释(comment)。 - **路径**:XPath通过路径表达式...

    Struts2中Struts.xml配置文件详解

    "Struts2 中 Struts.xml 配置文件详解" Struts2 中的 Struts.xml 配置文件是 Struts2 框架的核心配置文件,用于定义应用程序的行为和结构。在 Struts.xml 文件中,我们可以定义 package、action、interceptor、...

    c# 操作XML 技术

    C# 操作 XML 技术详解 XML 作为一个非常重要的纯文本格式已经进入了编程的很多领域,作为一个面向应用层面的 C# 也一样在很多领域离不开 XML。但是,C# 在很多方面对 XML 做了写封装,以至于很多操作 XML 的代码,...

    GenICam XML协议

    ### GenICam XML协议详解 #### 一、概述 GenICam XML协议是GenICam标准框架中的一个重要组成部分,主要用于定义和描述机器视觉系统中相机的功能特性及其配置参数。通过标准化的XML文件格式,该协议使得不同厂商的...

    struts.xml配置文件详解

    ### Struts.xml配置文件详解 #### 一、Struts配置文件概述 在Struts框架中,`struts.xml`配置文件扮演着极其重要的角色。它主要用于定义应用中的各种配置信息,包括但不限于包(Package)、拦截器(Interceptor)...

    xml使用例子的详解

    - **命名空间(Namespace)**:用于区分相同标签名但来自不同源的数据,通过`xmlns`定义。 - **声明(Declaration)**:每个XML文档以`&lt;?xml version="1.0" encoding="UTF-8"?&gt;`开头,定义XML版本和编码。 2. **...

    java xml realworld problem

    Java XML 实际问题详解 XML(可扩展标记语言)作为一种数据交换格式,广泛应用于Java编程中,尤其是在构建跨平台、跨系统的应用程序时。本篇将深入探讨Java与XML结合处理实际问题的技术细节。 1. Java XML 解析器...

    C#操作XML文件(绝对详解)

    处理包含命名空间的XML文件时,需要使用NamespaceManager或指定前缀。例如: ```csharp XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable); nsmgr.AddNamespace("ns", ...

    struts.xml配置详解

    在标签中,开发者可以定义包的名称(name)、继承的包(extends)、包的命名空间(namespace)以及是否抽象(abstract)。继承的概念允许子包获取父包中定义的所有配置信息,包括action、result和interceptor等。包...

    struts.xml文件详解示例代码

    - `namespace`属性:定义了包的命名空间,用于区分不同包的动作。 3. **元素**: - `&lt;action&gt;` 用于定义一个具体的操作,它对应一个控制器类或方法。 - `name`属性:定义了请求路径,也就是用户在URL中看到的...

    xml实用教程_XML_Schema结构

    ### XML Schema结构详解 #### 一、XML Schema简介 **XML Schema** 是一种标准化的语言,用于定义XML文档的结构和内容。它被视为继DTD(Document Type Definition)之后的第二代XML描述标准。与DTD相比,XML Schema...

    【ASP.NET编程知识】.net读写xml文档详解.docx

    namespace WriteXML { class Class1 { static void Main(string[] args) { try { // 创建 XmlTextWriter 实例 using (var textWriter = new XmlTextWriter("C:\\w3sky.xml", null)) { textWriter....

    dom4j 操作详解

    在处理 XML 文档时,我们经常遇到命名空间(Namespace)和限定名(QName)。QName 表示一个元素或属性的全名,由命名空间前缀(prefix)和本地名称(local name)组成。命名空间用于避免元素和属性名称的冲突,特别...

    struts2.0中struts.xml配置文件详解

    在深入探讨Struts2.0框架中的`struts.xml`配置文件之前,我们先来了解一下Struts2.0框架的基本概念。Struts2是Apache软件基金会的一个开源项目,它是一个基于MVC(Model-View-Controller)设计模式的Java Web应用...

    xml中的xmlns:、xmlns:xsi和xsi:schemaLocation.doc

    "XML中的xmlns、xmlns:xsi和xsi:schemaLocation详解" XML文档中的xmlns、xmlns:xsi和xsi:schemaLocation是三个重要的元素,分别用于定义XML文档的命名空间、XML schema实例和schemaLocation。 一、xmlns xmlns是...

    struts.xml详解.doc

    `namespace`定义了Action URL的前缀,用于路由请求。 5. **interceptors标签**: `&lt;interceptors&gt;`用来定义拦截器。拦截器是Struts2中的一种机制,它们在Action执行前后执行特定的任务,如日志记录、性能统计等。`...

    struts.xml文件详解

    - `namespace`: 定义包的命名空间,影响 Action 的 URL 路径。例如,`/test` 命名空间意味着 Action 访问路径前缀为 `/struts2/test/`。 5. **&lt;interceptors&gt; 和 **: - `&lt;interceptors&gt;` 子元素用来定义拦截器,...

    c#将xml导入到access数据库

    #### 导入过程详解 ### 一、准备环境 在开始之前,确保您的开发环境中已安装以下组件: - Visual Studio 或其他支持C#的IDE。 - Microsoft Office(包含Access)或单独的Microsoft Access数据库引擎。 ### 二、...

Global site tag (gtag.js) - Google Analytics