PostgreSQL生成的XML Schema编译失败,XML校验报错求助
解决PostgreSQL table_to_xmlschema生成的XSD校验XML时的QName解析错误
这个报错的根源在于PostgreSQL的table_to_xmlschema函数在处理自定义域(比如你创建的text_entidad)时,会引用一个内部的类型别名VARCHAR_100,但这个类型并没有在生成的prueba.xsd中被定义,所以xmllint找不到对应的简单类型定义,导致编译失败。
问题分析
当你创建自定义域text_entidad为character varying(100)时,PostgreSQL内部会给这个类型分配一个别名VARCHAR_100。但table_to_xmlschema生成XSD时,只是直接引用了这个内部别名,却没有在XSD中添加对应的类型定义,这就违反了XSD的规范——所有引用的类型必须是已声明的。
两种解决方案
方案1:手动修改生成的XSD文件
找到prueba.xsd中关于Domain.pruebadb.public.text_entidad的定义部分,它大概长这样:
<xs:simpleType name="Domain.pruebadb.public.text_entidad"> <xs:restriction base="VARCHAR_100"/> </xs:simpleType>
你可以直接把它替换为标准的XSD字符串限制,这样xmllint就能识别了:
<xs:simpleType name="Domain.pruebadb.public.text_entidad"> <xs:restriction base="xs:string"> <xs:maxLength value="100"/> </xs:restriction> </xs:simpleType>
或者,先在XSD中定义VARCHAR_100类型,再让自定义域引用它:
<!-- 先添加这个类型定义 --> <xs:simpleType name="VARCHAR_100"> <xs:restriction base="xs:string"> <xs:maxLength value="100"/> </xs:restriction> </xs:simpleType> <!-- 保留原来的自定义域定义 --> <xs:simpleType name="Domain.pruebadb.public.text_entidad"> <xs:restriction base="VARCHAR_100"/> </xs:simpleType>
修改后再用xmllint校验,就能通过了。
方案2:避免使用自定义域,直接用原生类型
如果你不需要保留自定义域的话,可以修改表的创建语句,直接使用character varying(100)代替text_entidad:
create table prueba ( cod_prueba bigint not null, prueba character varying(100) not null, primary key(cod_prueba), unique(prueba) );
重新生成XSD和XML后,table_to_xmlschema会直接生成标准的XSD类型限制,不会再出现未定义的VARCHAR_100别名,这样xmllint就能正常校验了。
内容的提问来源于stack exchange,提问作者Arcadio
相关产品推荐
相关产品推荐

