因此,我正在尝试提取我的 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: 'simpleType' 的内容必须匹配(注释?,(限制 | list | union)). 没有找到足够的元素。
) 那么 - 我应该传递/设置一些选项来更正输出吗?如果没有内置选项,Postgres 中是否有一种简单的方法来调整/更正 table_to_xmlschema 的输出?对于任何建议的解决方案 - 我必须做些什么才能使 JAXB 正确处理生成的模式?
如果重要的话,我正在使用 Postgres 9.1 和(我认为)jaxb-impl 2.1.6。
提前致谢!
最佳答案
正如 Craig 指出的那样,当前的 table_to_xmlschema
函数不会递归地分解递归类型。我认为这种情况在不久的将来不会发生变化,而且在稳定版本中肯定不会发生变化,因此您最好的选择是编写自己的函数来查看目录,并递归地为您构建模式。这应该不会太糟糕,但它会有点工作。我实际上正在从事类似的项目,用于在 PostgreSQL 和应用程序之间进行复杂的数据表示,但不使用 XML 作为中介。执行此操作所需的实际查询并不算太糟糕。
您需要做的是创建一个递归查询来查找类型(pg_attribute 和 pg_type 上的 WITH RECURSIVE cte),然后是一个函数,可能是 pl/perl 或类似的,它会为您生成适当的文本.
虽然内置函数对您不起作用。
关于xml - Postgres : using table_to_xmlschema on a table with a Box element,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12145854/