XSD抽象复杂类型无派生非抽象类型时如何生成合法XML
XSD抽象简单内容类型实例化问题解决方案
报错
cvc-type.2: The type definition cannot be abstract for element Foo的核心原因是STE_SomeType被标记为abstract="true",W3C XSD规范明确禁止直接实例化抽象类型,因此无法直接通过xsi:type引用该类型编写XML。
方案1:扩展原XSD新增具体派生类型
如果允许对原有XSD进行扩展,你可以在自定义的XSD文件中导入原XSD,定义一个继承自STE_SomeType的非抽象类型即可,示例如下:
<!-- 先导入原XSD的命名空间 --> <xsd:import namespace="http://www.example.com/namespace/datatype" schemaLocation="原xsd文件路径.xsd"/> <!-- 定义非抽象的具体派生类型 --> <xsd:complexType name="ConcreteSomeType"> <xsd:simpleContent> <xsd:extension base="dat:STE_SomeType"/> </xsd:simpleContent> </xsd:complexType>
编写XML时引用该具体类型即可通过校验:
<Foo xmlns:dat="http://www.example.com/namespace/datatype" xmlns:my="你的自定义扩展命名空间" xsi:type='my:ConcreteSomeType'>abc</Foo>
方案2:无需扩展XSD的兼容处理
XML本身不支持在文档内定义“私有类型”,所有类型定义必须在XSD中完成。但由于STE_SomeType本质是对xsd:string的空扩展:
- 如果原XSD中
Foo元素的声明允许的类型包含xsd:string或STE_SomeType的父类型,可直接省略xsi:type属性,直接编写内容即可:
该内容完全符合<Foo>abc</Foo>STE_SomeType的结构约束,只要元素的类型允许字符串值即可通过校验。
不推荐的临时处理方式
如果仅用于临时测试,部分XML校验工具支持关闭抽象类型校验开关,跳过该规则校验,但该方式不符合XSD规范,不建议在生产环境使用。
内容的提问来源于stack exchange,提问作者Mr Beater
相关产品推荐
相关产品推荐

