xml命名空间的核心作用是解决元素和属性重名问题,通过唯一uri区分不同标准的同名元素,前缀仅为uri的别名;声明方式包括带前缀的xmlns:prefix="uri"和默认的xmlns="uri",后者仅作用于元素且全文档唯一;命名空间作用域遵循就近原则,属性不继承默认命名空间,需显式加前缀;实际解析时必须严格匹配uri(大小写敏感)并注册命名空间映射。

XML命名空间(namespace)的核心作用是解决元素和属性重名问题——比如两个不同标准都定义了 <table>,解析器靠命名空间URI来区分它们属于哪个“家族”。关键不在前缀(如 <code>h: 或 f:),而在于背后的URI(如 http://www.w3.org/TR/html4/),前缀只是方便书写和阅读的别名。
怎么声明命名空间:xmlns:前缀="URI"
用 xmlns:前缀 属性绑定一个唯一URI,该前缀即可用于限定后续元素:
-
<root xmlns:h="http://www.w3.org/TR/html4/"></root>表示所有h:xxx元素属于HTML4语义 -
<table><tr><td>A</td></tr></table>中的每个标签都被明确归入该命名空间 - 前缀可自定义(
h、html、x都可以),但URI必须全局唯一,通常用网址形式(不强制可访问)
默认命名空间:xmlns="URI"
省去每个元素写前缀的麻烦,适用于整块结构统一归属同一规范:
-
<books xmlns="http://example.com/books"><title>XML指南</title></books>→<title></title>自动属于该URI下 - 注意:默认命名空间只影响元素,不影响属性;一个XML文档中只能有一个默认命名空间
- 若同时用了带前缀的命名空间(如
xmlns:dc="http://purl.org/dc/elements/1.1/"),则<creator></creator>和<title></title>就分属不同空间
命名空间的作用范围与位置
命名空间声明不是全局生效,而是遵循“就近原则”:
- 在某个元素上声明(如
<section xmlns:ns="urn:test"></section>),则只对该元素及其所有后代中未被其他声明覆盖的部分有效 - 可以在根元素统一声明,也可在子元素局部声明——后者会覆盖父级同名前缀(不推荐随意嵌套覆盖,易出错)
- 属性本身不继承默认命名空间,必须显式加前缀才能归属某命名空间(如
<item ns:id="123"></item>)
实际解析时要注意什么
写XML只是第一步,真正使用时(如XPath查询、XSLT转换、C#或Java解析)需严格匹配命名空间:
- 用XPath查
dc:date,不能只写//date,得注册命名空间映射,再用//dc:date - libxml2、.NET的
XDocument、Java的DocumentBuilder都要求显式提供命名空间上下文,否则查不到带前缀的节点 - URI大小写敏感,
http://example.com/ns和http://example.com/NS被视为两个不同空间










