XML命名空间(namespace)怎么用 XML xmlns详解

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

XML命名空间(namespace)的核心作用是解决元素和属性重名问题——比如两个不同标准都定义了

,解析器靠命名空间URI来区分它们属于哪个“家族”。关键不在前缀(如 h:f:),而在于背后的URI(如 http://www.w3.org/TR/html4/),前缀只是方便书写和阅读的别名。

怎么声明命名空间:xmlns:前缀="URI"

xmlns:前缀 属性绑定一个唯一URI,该前缀即可用于限定后续元素:

  • 表示所有 h:xxx 元素属于HTML4语义
A
中的每个标签都被明确归入该命名空间
  • 前缀可自定义(hhtmlx 都可以),但URI必须全局唯一,通常用网址形式(不强制可访问)
  • 默认命名空间:xmlns="URI"

    省去每个元素写前缀的麻烦,适用于整块结构统一归属同一规范:

    • XML指南 自动属于该URI下
    • 注意:默认命名空间只影响元素,不影响属性;一个XML文档中只能有一个默认命名空间
    • 若同时用了带前缀的命名空间(如 xmlns:dc="http://purl.org/dc/elements/1.1/"),则 就分属不同空间

    命名空间的作用范围与位置

    命名空间声明不是全局生效,而是遵循“就近原则”:

    • 在某个元素上声明(如
      ),则只对该元素及其所有后代中未被其他声明覆盖的部分有效
    • 可以在根元素统一声明,也可在子元素局部声明——后者会覆盖父级同名前缀(不推荐随意嵌套覆盖,易出错)
    • 属性本身不继承默认命名空间,必须显式加前缀才能归属某命名空间(如

    实际解析时要注意什么

    写XML只是第一步,真正使用时(如XPath查询、XSLT转换、C#或Java解析)需严格匹配命名空间:

    • 用XPath查 dc:date,不能只写 //date,得注册命名空间映射,再用 //dc:date
    • libxml2、.NET的 XDocument、Java的 DocumentBuilder 都要求显式提供命名空间上下文,否则查不到带前缀的节点
    • URI大小写敏感,http://example.com/nshttp://example.com/NS 被视为两个不同空间