targetNamespace 定义 XSD 中声明的元素和类型所属的命名空间,xmlns 指定当前 XSD 文件内无前缀标签所归属的默认命名空间;二者常设为相同值以简化对自定义类型的引用。

targetNamespace 和 xmlns 在 XSD 文件中作用不同,但经常配合使用——前者定义“这个 schema 产出的元素属于哪个命名空间”,后者决定“当前 schema 文件里写的东西默认归谁管”。
targetNamespace 是“出品归属”
它声明:本 XSD 文件中定义的所有顶层元素、类型、属性等,默认都属于这个命名空间。比如:
-
targetNamespace="http://example.com/order"表示、、xs:complexType name="OrderType"这些东西的“身份证地址”是http://example.com/order - 其他 XML 文件要引用这些定义,就必须在
xsi:schemaLocation中配对写上这个 URI 和实际 XSD 路径
xmlns 是“当前文件的默认语境”
它告诉解析器:“接下来没加前缀的标签(比如 、),按哪个命名空间理解”。XSD 本身是 XML,所以也要遵守命名空间规则:
-
xmlns="http://www.w3.org/2001/XMLSchema"让可以简写成(如果同时配了xmlns:xs=……,那更推荐用带前缀写法) - 如果想在 XSD 里直接引用自己定义的类型(比如
type="OrderType"),通常需要把xmlns设成和targetNamespace相同——这样OrderType就自动落在那个命名空间下,不用每次都写tns:OrderType
为什么 常看到 xmlns = targetNamespace?
这不是强制要求,而是实用选择:
- 当 XSD 定义了自定义类型(如
),又希望在同个文件里用type="Person"引用它,就得让Person所属命名空间被默认激活——也就是靠xmlns="……"把它设为当前默认空间 - 如果不设,就得给每个自定义类型加前缀,比如
type="tns:Person",而这就要求先声明xmlns:tns="http://example.com/order" - 简单说:设成一样,是为了少打字、少出错、逻辑更直觉
XML 实例怎么对应?
一个用了该 XSD 的 XML 文件,要能通过验证,必须满足:
- 根元素或相关元素声明了匹配的命名空间,例如
xmlns="http://example.com/order"或xmlns:ord="http://example.com/order" - 同时提供
xsi:schemaLocation="http://example.com/order order.xsd",让 处理器 知道去哪里找定义 - 如果 XSD 中
elementFormDefault="qualified"(常见),那么所有本地元素(非全局声明的)也必须带命名空间前缀或默认空间
基本上就这些。不复杂但容易忽略——关键记住:targetNamespace 是“我产出的东西姓什么”,xmlns 是“我现在说话默认用哪套家谱”。