为带自定义xsi:type的XML创建XSD出现命名空间错误如何解决
问题核心
你的报错和验证不通过主要来自两个配置错误:
- 验证时选择了无POSLog根元素声明的schema1.xsd作为验证根,导致找不到匹配的全局根声明
- 命名空间配置不匹配:XML中
<object>继承了POSLog的默认命名空间,但是你把<object>的定义放在了无命名空间的schema1.xsd中,二者无法匹配;同时object.xsd的elementFormDefault="unqualified"会导致目标命名空间下的子元素不继承命名空间,和XML实际结构冲突
修改后的完整XSD文件
1. object.xsd(验证XML时指定该文件作为根Schema)
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" targetNamespace="http://www.nrf-arts.org/IXRetail/namespace/" attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <!-- 导入无命名空间的schema1.xsd,用于校验无命名空间的SequenceNumber元素 --> <xs:import schemaLocation="schema1.xsd" /> <!-- 定义基础object复杂类型 --> <xs:complexType name="object"> <xs:sequence> <xs:element name="elt1" type="xs:string"/> </xs:sequence> </xs:complexType> <!-- 定义继承自object的A类型,匹配xsi:type="A"的声明 --> <xs:complexType name="A"> <xs:complexContent> <xs:extension base="object"> <xs:sequence> <xs:element name="elt2" type="xs:string"/> <xs:element name="elt3" type="xs:string"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> <!-- 定义当前命名空间下的object元素 --> <xs:element name="object" type="object" /> <!-- 定义根元素POSLog --> <xs:element name="POSLog"> <xs:complexType> <xs:sequence> <!-- 引用当前命名空间下的object元素 --> <xs:element ref="object" /> <!-- 引用导入的无命名空间schema1中的SequenceNumber元素 --> <xs:element ref="SequenceNumber" /> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
2. schema1.xsd(仅保留无命名空间的SequenceNumber定义)
<?xml version="1.0" encoding="utf-8"?> <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <!-- 无命名空间的SequenceNumber定义,匹配XML中xmlns=""的SequenceNumber元素 --> <xs:element name="SequenceNumber" type="xs:unsignedByte" /> </xs:schema>
验证说明
验证你的test.xml时,选择object.xsd作为根Schema即可正常通过校验,无需修改原XML的任何结构。
内容的提问来源于stack exchange,提问作者AbRe
相关产品推荐
相关产品推荐

