You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 18:23:01