乐途乐途
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
  • 学习路径
  • XML 基础语法

    • XML 概述
    • XML 文档结构
    • XML 元素
    • XML 属性
    • XML 语法规则
    • XML 命名空间
    • XML 注释与处理指令
  • DTD 与文档验证

    • DTD 概述
    • DTD 元素声明
    • DTD 属性声明
    • DTD 实体声明
    • DTD 元素与属性对比
    • DTD 完整示例
  • XML Schema 定义

    • XML Schema 概述
    • XSD 简单类型
    • XSD 复杂类型
    • XSD 命名空间与引用
  • XPath 节点定位

    • XPath 概述
    • XPath 路径表达式
    • XPath 谓词与函数
  • XSLT 转换

    • XSLT 概述
    • XSLT 模板与匹配
    • XSLT 控制结构
    • XSLT 输出控制
  • XML 解析技术

    • XML 解析概述
    • DOM 解析
    • SAX 解析
    • StAX 解析
    • XML 与 Java — JAXP
  • XML 在 Java 中的应用

    • Spring XML 配置
    • MyBatis XML 映射
    • pom.xml 与 Maven
    • web.xml 配置详解
  • 现代数据格式对比

    • XML 与 JSON 对比
    • XML 与 YAML 对比
  • XML 显示与浏览器集成

    • XML 在浏览器中的显示
    • XMLHttpRequest 与 AJAX
    • 服务器端 XML 处理
  • XML 进阶查询与链接

    • XQuery 查询语言
    • XLink 超链接
    • XML 验证工具使用
  • XML Web 服务(选读)

    • XML Web 服务概述
    • SOAP 协议详解
    • WSDL 服务描述
    • RSS 内容聚合
    • RDF 资源描述框架

XML 命名空间

本章定位 :解决 XML 多来源混合使用时的元素/属性命名冲突问题。掌握 xmlns 声明的两种方式(默认前缀和有前缀),理解 URI 的唯一标识作用。

定义与作用

当两个不同的 XML 词汇表被混合使用时,可能出现 命名冲突——两个词汇表定义了同名但含义不同的元素或属性。

例如,一个 XML 文档同时包含 HTML 的 <table>(数据表格)和自定义的 <table>(一张桌子),解析器无法区分。 XML 命名空间 通过给每个元素/属性关联一个唯一的 URI 来消除歧义。

命名空间的核心机制:

  • 声明 :xmlns:prefix="URI" 将前缀绑定到命名空间
  • 限定 :prefix:element 表示该元素属于 prefix 对应的命名空间
  • URI :仅仅是一个全局唯一的字符串标识符(通常使用 URL 格式), 不需要实际可访问

核心原理:命名空间声明与作用域

图解释 :xmlns:h 和 xmlns:f 分别声明了两个命名空间绑定。h:table 和 f:table 虽然标签名相同,但因为命名空间不同,解析器可以明确区分它们。

语法/结构要点

命名空间声明的两种方式

方式语法作用范围示例
带前缀xmlns:prefix="URI"该元素及其后代中,prefix:element 属于此命名空间xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
默认命名空间xmlns="URI"该元素及其后代中,所有无前缀的元素默认属于此命名空间xmlns="http://www.w3.org/1999/xhtml"

关键规则

规则说明
URI 不需要可访问http://www.w3.org/1999/xhtml 只是唯一标识字符串,浏览器不会去访问
前缀可以任意取xmlns:foobar="URI" 也合法,但约定使用有意义的缩写
作用域可覆盖子元素可以重新声明 xmlns 来覆盖父元素的命名空间
属性默认无命名空间除非显式加前缀,否则属性不属于任何命名空间

完整示例:飞翔科技整合两份 XML 数据

场景说明

飞翔科技的前端开发 小崔 需要在一个页面中同时展示 HTML 表格(W3C HTML 命名空间)和公司内部"家具清单"XML(自定义命名空间)。直接合并后,两个 <table> 元素产生了冲突。

操作前:命名冲突

<?xml version="1.0" encoding="UTF-8"?>
<mixed>
  <!-- 这里 table 是家具表 -->
  <table>
    <name>办公桌</name>
    <width>120cm</width>
  </table>
  <!-- 这里 table 是 HTML 数据表格 -->
  <table>
    <tr><td>姓名</td><td>部门</td></tr>
    <tr><td>小崔</td><td>技术部</td></tr>
  </table>
</mixed>

问题:两个 <table> 含义完全不同,但标签名相同。

操作后:命名空间区分

<?xml version="1.0" encoding="UTF-8"?>
<mixed xmlns:h="http://www.w3.org/1999/xhtml"
       xmlns:f="https://learnto.cn/furniture">
  <!-- 家具表 —— 属于 f 命名空间 -->
  <f:table>
    <f:name>办公桌</f:name>
    <f:width>120cm</f:width>
  </f:table>
  <!-- HTML 表格 —— 属于 h 命名空间 -->
  <h:table>
    <h:tr><h:td>姓名</h:td><h:td>部门</h:td></h:tr>
    <h:tr><h:td>小崔</h:td><h:td>技术部</h:td></h:tr>
  </h:table>
</mixed>

操作结果

加了命名空间前缀后,解析器和人类读者都能一眼区分 f:table(家具)和 h:table(HTML 数据表格)。XPath 查询也变得更精确:

//f:table    →  只选家具表
//h:table    →  只选 HTML 表格
//table      →  什么都不选(因为没有无前缀的 table)

易错场景

错误一:以为 XML 命名空间 URI 必须能访问

<!-- 即使 http://example.com/xyz 返回 404,命名空间依然有效 -->
<root xmlns:test="http://example.com/xyz">

URI 只是字符串标识符,解析器不验证它是否可访问。约定了要用 URL 格式,因为你拥有的域名天然全局唯一。

错误二:默认命名空间不覆盖属性

<root xmlns="http://example.com">
  <child attr="value"/>   <!-- attr 不属于任何命名空间 -->
</root>

默认命名空间只影响无前缀的 元素 ,属性默认没有命名空间。如果需要命名空间化的属性,必须显式加前缀。

错误三:在 XPath 中忘记处理命名空间

<!-- XML -->
<root xmlns:ns="http://example.com">
  <ns:item>Hello</ns:item>
</root>
<!-- ❌ 直接写 element 名找不到 -->
//item

<!-- ✅ 必须注册命名空间或在 XPath 引擎中绑定前缀 -->
//ns:item

面试考点

考点参考答案要点
为什么 XML 需要命名空间?当不同来源/词汇表的 XML 混合使用时,同名元素无法区分。命名空间通过 URI 提供全局唯一的标识符解决命名冲突
xmlns 的 URI 必须是可访问的 URL 吗?不需要。URI 只是唯一字符串标识,用 URL 格式是因为域名天然全局唯一。解析器不会发起 HTTP 请求
默认命名空间和前缀命名空间有什么区别?默认命名空间(xmlns="URI")应用于所在元素及其所有无前缀子元素;前缀命名空间(xmlns:pre="URI")只应用于 pre: 前缀的元素。属性默认不受默认命名空间影响
上一页
XML 语法规则
下一页
XML 注释与处理指令