从导入XSD扩展复杂类型,XML验证提示预期baseElement错误排查
问题:扩展导入XSD中的复杂类型后XML验证失败
我想要扩展一个在导入的XSD中定义的复杂类型,为此搭建了以下示例:
Base.xsd
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.com/base"> <xs:complexType name="BaseType"> <xs:sequence> <xs:element name="baseElement" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:schema>
Extended.xsd
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:base="http://www.example.com/base" xmlns="http://www.example.com/extended" targetNamespace="http://www.example.com/extended"> <xs:import namespace="http://www.example.com/base" schemaLocation="Base.xsd" /> <xs:complexType name="ExtendedType"> <xs:complexContent> <xs:extension base="base:BaseType"> <xs:sequence> <xs:element name="extendedElement" type="xs:int" /> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> <xs:element name="ExtendedElement" type="ExtendedType" /> </xs:schema>
Example.xml
<?xml version="1.0" encoding="UTF-8"?> <extended:ExtendedElement xmlns:extended="http://www.example.com/extended" xmlns="http://www.example.com/base" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.com/extended extended.xsd http://www.example.com/base base.xsd"> <baseElement>someString</baseElement> <extendedElement>3</extendedElement> </extended:ExtendedElement>
现在该XML存在验证问题:我收到错误提示,称预期存在baseElement元素,但错误恰好显示在该元素上。请问我的XSD定义是否存在问题?
解答
你的XSD定义没有问题,问题出在XML实例的命名空间使用上。
原因分析
BaseType中的baseElement属于http://www.example.com/base命名空间,当ExtendedType扩展BaseType后,这个元素仍然保留原命名空间归属。你在XML中虽然设置了默认命名空间为base的命名空间,但部分XML验证器可能无法正确将未加前缀的baseElement关联到base命名空间,或是因父元素属于extended命名空间导致上下文混淆,从而触发验证错误。
修正后的Example.xml
<?xml version="1.0" encoding="UTF-8"?> <extended:ExtendedElement xmlns:extended="http://www.example.com/extended" xmlns:base="http://www.example.com/base" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.com/extended extended.xsd http://www.example.com/base base.xsd"> <base:baseElement>someString</base:baseElement> <extendedElement>3</extendedElement> </extended:ExtendedElement>
说明
显式声明base前缀并用于baseElement,明确指定该元素属于base命名空间,与XSD中BaseType的定义完全匹配,验证器就能正确识别元素归属,解决验证错误。这种方式也更清晰,能避免潜在的命名空间冲突或识别问题。
内容的提问来源于stack exchange,提问作者user3726374
相关产品推荐
相关产品推荐

