1

因此,我正在尝试提取我的 Postgres 数据库表的 XML 描述,我可以将其与 JAXB 一起使用来处理一些 Java<->DB 通信。问题是,我对表中的几个字段使用 Postgres 'box' 数据类型,而 Postgres table_to_xmlschema 似乎没有为框生成有效的 XML。

这是我的SSCCE:

Postgres 表创建:create table BoxTest ( foo Box);

Postgres 调用以生成 XML 模式:select * from table_to_xmlschema('BoxTest', true, true, 'SomeName');

生成的架构:

<xsd:schema
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     targetNamespace="SomeName"
     elementFormDefault="qualified">
 <xsd:simpleType name="UDT.User.pg_catalog.box">
 </xsd:simpleType>
 <xsd:complexType name="RowType.User.public.boxtest">
   <xsd:sequence>
     <xsd:element name="foo" type="UDT.User.pg_catalog.box" nillable="true"></xsd:element>
   </xsd:sequence>
 </xsd:complexType>
 <xsd:element name="boxtest" type="RowType.User.public.boxtest"/>
</xsd:schema>

问题是“box”类型的描述是空的,尽管它是 Postgres 的内置类型。(特别是,我收到 SAX 解析错误,并显示消息org.xml.sax.SAXParseException: s4s-elt-must-match.2: The content of 'simpleType' must match (annotation?, (restriction | list | union)). Not enough elements were found.)所以 - 是否有一些选项我应该传递/设置来更正该输出?如果没有内置选项,Postgres 中是否有一种简单的方法来调整/更正 table_to_xmlschema 的输出?对于任何提议的解决方案 - 我必须做些什么才能使 JAXB 与生成的模式一起正常工作?

如果重要的话,我使用的是 Postgres 9.1,和(我认为)jaxb-impl 2.1.6。

提前致谢!

4

1 回答 1

0

正如 Craig 所指出的,当前table_to_xmlschema函数不会递归地分解递归类型。我看不到这种变化在不久的将来,而且肯定不会在稳定版本中发生,所以你最好的选择是编写你自己的函数来查看目录,并为你递归地构建一个模式。这不应该太糟糕,但它会有点工作。我实际上正在为 PostgreSQL 和应用程序之间的复杂数据表示进行类似的项目,尽管没有使用 XML 作为中介。执行此操作所需的实际查询并不算太糟糕。

您需要做的是创建一个递归查询来查找类型(pg_attribute 和 pg_type 上的 WITH RECURSIVE cte),然后创建一个函数,可能在 pl/perl 等中,它为您生成适当的文本。

但是,内置函数对您不起作用。

于 2013-04-07T07:46:54.990 回答