如何在带命名空间的Company.xsd中导入无命名空间的Department.xsd?
无命名空间XSD导入带命名空间XSD的问题分析与解决
原文件说明
Department.xsd(无命名空间)
<?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1-0"> <xs:complexType name="Department"> <xs:sequence> <xs:element name="Name"/> <xs:element name="Manager"/> </xs:sequence> </xs:complexType> </xs:schema>
目标是将这个无命名空间的XSD导入到带有MainNameSpace命名空间的Company.xsd中,以下是四种错误方案的问题分析:
方案1错误分析
错误提示:'Type 'MainNameSpace:Department' is not declared.'
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns="MainNameSpace" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="MainNameSpace" elementFormDefault="unqualified" attributeFormDefault="unqualified"> <xs:import schemaLocation="Department.xsd"/> <xs:element name="company" type="Company"/> <xs:complexType name="Company"> <xs:sequence> <xs:element name="Name" type="xs:string"/> <xs:element name="Department" type="Department"/> </xs:sequence> </xs:complexType> </xs:schema>
问题:
- Company.xsd的默认命名空间为
MainNameSpace,引用Department类型时会自动附加该命名空间前缀,但Department.xsd中的类型属于无命名空间,因此无法匹配到对应类型。 - 未给无命名空间的XSD声明专属前缀,无法精准引用其定义的类型。
方案2错误分析
错误提示:Namespace attribute of an import must not match the real value of the enclosing targetNamespace of the .
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns="MainNameSpace" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:m="MainNameSpace" targetNamespace="MainNameSpace" elementFormDefault="unqualified" attributeFormDefault="unqualified"> <xs:import schemaLocation="Department.xsd" namespace="MainNameSpace"/> <xs:element name="company" type="Company"/> <xs:complexType name="Company"> <xs:sequence> <xs:element name="Name" type="xs:string"/> <xs:element name="Department" type="m:Department"/> </xs:sequence> </xs:complexType> </xs:schema>
问题:
xs:import的namespace属性不能与当前XSD的targetNamespace相同,同命名空间的文件应使用xs:include而非xs:import;且Department.xsd本身无命名空间,该配置完全不符合规则。
方案3错误分析
错误提示:Type 'dummy_namespace:Department' is not declared.
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns="MainNameSpace" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:m="dummy_namespace" targetNamespace="MainNameSpace" elementFormDefault="unqualified" attributeFormDefault="unqualified"> <xs:import schemaLocation="Department.xsd" namespace="dummy_namespace"/> <xs:element name="company" type="Company"/> <xs:complexType name="Company"> <xs:sequence> <xs:element name="Name" type="xs:string"/> <xs:element name="Department" type="m:Department"/> </xs:sequence> </xs:complexType> </xs:schema>
问题:
- 为
xs:import指定了不存在的dummy_namespace,但Department.xsd本身无命名空间,该命名空间与Department.xsd的类型无任何关联,因此无法找到m:Department类型。
方案4错误分析
错误提示:Type 'MainNameSpace:Department' is not declared.
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns="MainNameSpace" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="MainNameSpace" elementFormDefault="unqualified" attributeFormDefault="unqualified"> <xs:include schemaLocation="Department.xsd"/> <xs:element name="company" type="Company"/> <xs:complexType name="Company"> <xs:sequence> <xs:element name="Name" type="xs:string"/> <xs:element name="Department" type="Department"/> </xs:sequence> </xs:complexType> </xs:schema>
问题:
xs:include要求被包含的XSD与当前XSD属于同一命名空间,但Department.xsd无命名空间,与当前XSD的MainNameSpace不匹配,导致无法正确包含,类型引用失败。
正确解决方案
步骤1:修改Company.xsd
为无命名空间的XSD声明专属前缀(如ns0),通过xs:import导入时不指定namespace属性(表示导入无命名空间的XSD),随后用前缀引用Department类型:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns="MainNameSpace" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns0="" <!-- 声明无命名空间的前缀 --> targetNamespace="MainNameSpace" elementFormDefault="unqualified" attributeFormDefault="unqualified"> <xs:import schemaLocation="Department.xsd"/> <!-- 导入无命名空间的XSD --> <xs:element name="company" type="Company"/> <xs:complexType name="Company"> <xs:sequence> <xs:element name="Name" type="xs:string"/> <xs:element name="Department" type="ns0:Department"/> <!-- 使用前缀引用无命名空间的类型 --> </xs:sequence> </xs:complexType> </xs:schema>
步骤2:修正C#编译代码
添加Department.xsd时指定命名空间为null(表示无命名空间),添加Company.xsd时指定其命名空间为MainNameSpace:
var schema = new XmlSchemaSet(); // 添加无命名空间的Department.xsd schema.Add(null, Path.Combine(baseDirectory, "Department.xsd")); // 添加带有MainNameSpace命名空间的Company.xsd schema.Add("MainNameSpace", Path.Combine(baseDirectory, "Company.xsd")); schema.Compile();
内容的提问来源于stack exchange,提问作者Helic
相关产品推荐
相关产品推荐

