XML Schema targetNamespace作用 XSD目标命名空间详解

2次阅读

targetnamespace决定xsd中全局成分的命名空间归属,xml实例须声明匹配命名空间才能验证通过;需协同elementformdefault控制局部元素限定,且xsi:schemalocation首部须与targetnamespace严格一致。

XML Schema targetNamespace作用 XSD目标命名空间详解

如果您在编写或验证 XML 文档时遇到元素无法识别、类型未声明或验证失败等错误,很可能是由于 XSD 文件中 targetNamespace 设置不当或 XML 实例未正确匹配该命名空间。以下是深入解析其作用与关键行为的步骤:

一、定义 schema 中全局成分的归属命名空间

targetNamespace 元素的必需属性(当 schema 包含全局声明时),用于明确指定该 XSD 文件所定义的所有全局元素、全局属性、复杂类型、简单类型、组、属性组 所属的唯一命名空间 URI。该 URI 不是 URL,不需可访问,但必须为合法的 IRI 字符串,且验证器会逐字比对。

1、在 标签中添加 targetNamespace 属性,例如:targetNamespace=”http://example.com/invoice”

2、所有未加前缀的全局声明(如 )将自动归属于该命名空间;

3、该命名空间 URI 成为 XML 实例文档中引用这些结构的“契约地址”,不可随意更改大小写或末尾斜杠。

二、控制 XML 实例文档中元素是否受约束

XML 文档能否成功通过该 XSD 验证,取决于其根元素或相关元素是否显式声明了与 targetNamespace 完全一致的命名空间。验证器仅对属于该命名空间的元素执行类型与结构检查,其他命名空间下的同名元素将被忽略。

1、若 XML 使用默认命名空间,需在根元素中声明:xmlns=”http://example.com/invoice”

2、若 XML 使用带前缀的命名空间,需同时声明前缀与 URI:xmlns:inv=”http://example.com/invoice”,并在元素上使用前缀,如

3、若 XML 未声明任何命名空间,且 XSD 设有 targetNamespace,则所有全局元素均无法匹配,验证必然失败并报错 “cvc-elt.1: Cannot find the declaration of element ‘xxx’”。

三、协同 elementFormDefault 决定局部元素是否需命名空间限定

仅设置 targetNamespace 并不足以决定 XML 中每个嵌套元素是否必须带命名空间。该行为由 elementFormDefault 属性控制:当其值为 qualified 时,所有局部元素(即在 complexType 内定义的元素)也必须出现在该 targetNamespace 下;若为 unqualified(默认),则局部元素不参与命名空间限定。

1、在 中显式设置:elementFormDefault=”qualified”

2、此时 XML 中所有元素(包括 这类嵌套在 内的子元素)都必须通过默认命名空间或前缀归属到 targetNamespace;

3、若保持默认值 unqualified,则只需全局元素(如根 )匹配 targetNamespace,内部 可无前缀且无需命名空间声明。

四、影响 XSD 文件内部类型引用的书写方式

当 XSD 文件自身需引用自己定义的类型(如 complexType)时,targetNamespace 与文件内 xmlns 的取值关系直接决定是否需要前缀。若二者相同,则可直接使用无前缀的 type=”InvoiceType”;否则必须使用带前缀的 type=”tns:InvoiceType” 并提前声明 xmlns:tns=”http://example.com/invoice”。

1、在 标签中同时设置:targetNamespace=”http://example.com/invoice”xmlns=”http://example.com/invoice”

2、在该文件内定义类型:

3、在同文件内引用该类型时,可直接写:type=”InvoiceType”,无需前缀;

4、若未设置 xmlns 或设为其他 URI,则必须声明命名空间前缀并使用带前缀的引用形式。

五、校验 xsi:schemaLocation 映射是否准确

XML 实例文档需通过 xsi:schemaLocation 属性显式告知解析器:哪个命名空间 URI 对应哪个物理 XSD 文件路径。该属性值为成对出现的字符串,前半部分必须与 XSD 的 targetNamespace 严格一致,后半部分为相对或绝对路径。

1、在 XML 根元素中添加命名空间声明:xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”

2、添加 schemaLocation 属性:xsi:schemaLocation=”http://example.com/invoice invoice.xsd”

3、确保引号内第一个字符串与 XSD 中 targetNamespace 的值逐字符完全相等(包括协议、大小写、末尾斜杠、空格);

4、若使用 ide 或命令行验证工具,还需确认 invoice.xsd 文件实际存在且可读,路径解析无误。

text=ZqhQzanResources