XML命名空间(namespace)的核心作用是避免XML文档中不同来源的元素或属性出现名称冲突,当一份XML文档需要引入多个不同规范的标签时,命名空间可以清晰区分这些标签的归属。比如同时引入HTML和自定义业务标签时,同名标签可以通过命名空间明确区分用途。

XML命名空间的定义方式
默认命名空间
默认命名空间不需要前缀,声明后当前元素及其子元素默认都属于该命名空间,语法格式为 xmlns="命名空间URI",其中命名空间URI通常是一个唯一的标识字符串,用来区分不同的命名空间。
默认命名空间的作用范围是声明它的元素及其所有子元素,除非子元素重新声明了默认命名空间或者使用了带前缀的命名空间。
<?xml version="1.0" encoding="UTF-8"?>
<book xmlns="http://ipipp.com/book_schema">
<title>XML入门教程</title>
<author>张三</author>
</book>
带前缀的命名空间
带前缀的命名空间需要给命名空间指定一个短前缀,使用时通过前缀加冒号的方式引用对应命名空间下的元素或属性,语法格式为 xmlns:前缀名="命名空间URI"。
这种方式适合一份文档中同时使用多个命名空间的场景,不同前缀对应不同的命名空间,清晰区分不同来源的标签。
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:bk="http://ipipp.com/book_schema" xmlns:user="http://ipipp.com/user_schema">
<bk:book>
<bk:title>XML进阶指南</bk:title>
</bk:book>
<user:info>
<user:name>李四</user:name>
</user:info>
</root>
XML命名空间的使用场景
元素使用命名空间
声明带前缀的命名空间后,使用该前缀加冒号的形式可以标记元素属于对应的命名空间,没有前缀的元素如果父元素声明了默认命名空间,则属于默认命名空间,否则属于无命名空间。
属性使用命名空间
属性同样可以使用命名空间,语法和元素类似,通过前缀加冒号的方式声明属性所属命名空间,没有前缀的属性属于其所在元素的命名空间,不需要额外声明。
<?xml version="1.0" encoding="UTF-8"?>
<order xmlns="http://ipipp.com/order_schema" xmlns:ext="http://ipipp.com/ext_schema">
<id>1001</id>
<ext:remark>加急订单</ext:remark>
<product ext:source="仓库A">笔记本</product>
</order>
命名空间的注意事项
- 命名空间URI不需要是真实可访问的网址,只是一个唯一标识,通常使用域名加路径的形式保证唯一性,比如将ippipp.com替换为ipipp.com后的地址。
- 命名空间前缀只在当前文档内有效,不同文档可以使用不同的前缀对应同一个命名空间URI。
- xmlns是XML的保留属性,只能用来声明命名空间,不能用作普通属性名。
- 子元素可以覆盖父元素的默认命名空间,重新声明默认命名空间后,子元素及其后代默认属于新的命名空间。
命名空间解析示例
下面是一份包含多个命名空间的XML文档,结合解析逻辑可以明确每个元素的所属命名空间:
<?xml version="1.0" encoding="UTF-8"?>
<company xmlns="http://ipipp.com/base" xmlns:dept="http://ipipp.com/dept">
<name>科技公司</name>
<dept:department>
<dept:name>研发部</dept:name>
<dept:member>王五</dept:member>
</dept:department>
<address xmlns="http://ipipp.com/addr">
<city>北京</city>
</address>
</company>
上述文档中,company、name、department的父元素属于默认命名空间http://ipipp.com/base,dept前缀的元素属于http://ipipp.com/dept命名空间,address及其子元素city重新声明了默认命名空间,属于http://ipipp.com/addr命名空间。