首页 > 解决方案 > 在 Postgres 中将 JSONB 转换为 XML

问题描述

我有一张桌子

CREATE TABLE documents (
  id SERIAL PRIMARY KEY,
  author_id INTEGER NOT NULL FOREIGN KEY REFERENCES(author.id)
  content XML NOT NULL,
  created TIMESTAMP WITH TIMEZONE NOT NULL DEFAULT CURRENT_TIMESTAMP
)

我想将数据库从使用 XML 转换为 JSONB 来存储该数据。我想在一个 3 个阶段的过程中做到这一点:

  1. 创建一些将现有数据即时转换为 JSONB 的视图/函数;通过 Postgrest API 浮出水面
  2. 将现有系统从使用 XML 迁移到使用 JSONB,淘汰旧的 API 代码
  3. 将列从 XML 永久转换为 JSONB

这允许软件处理旧的 API(使用 XML 数据),同时我正在重构它的一部分以使用新的 API (JSONB)。一旦重构完成,我就可以关闭旧的 XML —— 快乐的日子。

我找到了将数据从 XML 转换为 JSONB 的答案:如何在 Postgres 中将 XML 转换为 JSONB

通过一些修改,我可以让它(非常)接近我现有的代码。简而言之,我可以将其转换为:

<xml>
  <hello>world</hello>
  <this is="your">captain</this>
</xml>

对此

{
    "xml": {
        "@tag": "xml",
        "this": {
            "@tag": "this",
            "@value": "captain",
            "@attributes": {
                "is": "your"
            }
        },
        "hello": {
            "@tag": "hello",
            "@value": "world",
            "@attributes": {}
        },
        "@value": null,
        "@attributes": {}
    }
}

编辑:由于@404 的反馈,上述内容略有修改

但是我需要一些方法来允许重构的代码将 JSONB 发送到新的(Postgrest)API,然后将数据转换为 XML,以便它仍然可以被非重构代码使用。

我已经查看了XML 函数,但我正在努力做到这一点,以便我可以动态地将 JSONB 转换回 XML 表单(只要我能回到这里,如果它有点混乱也没关系后面的 JSON 形式)。看起来我可以做到这一点

SELECT xmlelement(name hello, null, 'world')

但是当我尝试这样做时

SELECT xmlelement(name key, null, value)
FROM jsonb_each('{
        "this": {
            "@value": "captain",
            "@attributes": {
                "is": "your"
            }
        },
        "hello": {
            "@value": "world",
            "@attributes": {}
        },
        "@value": null,
        "@attributes": {}
    }'
)

如您所料,您会得到这样的 XML 输出...

<key>{"@value": "captain", "@attributes": {"is": "your"}}</key>

...其中 XML 元素称为“ key ”,而不是 key的值(在本例中为“this”)。

使用该xmlattributes函数时我遇到了类似的问题 - 我无法为属性指定来自数据库查询的名称。

有没有办法动态设置 XML 元素标签名称和属性名称?

更新:阅读下面的评论;无论如何,以上可能是错误的方法。如果有办法,我已经把问题留了下来,因为它可能会在未来帮助某人……但对我来说,我需要先重新考虑数据结构。

标签: xmlpostgresqlpostgrest

解决方案


推荐阅读