我有一张桌子
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 个阶段的过程中做到这一点:
- 创建一些将现有数据即时转换为 JSONB 的视图/函数;通过 Postgrest API 浮出水面
- 将现有系统从使用 XML 迁移到使用 JSONB,淘汰旧的 API 代码
- 将列从 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 元素标签名称和属性名称?
更新:阅读下面的评论;无论如何,以上可能是错误的方法。如果有办法,我已经把问题留了下来,因为它可能会在未来帮助某人……但对我来说,我需要先重新考虑数据结构。