xml - 在 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 个阶段的过程中做到这一点:
- 创建一些将现有数据即时转换为 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 元素标签名称和属性名称?
更新:阅读下面的评论;无论如何,以上可能是错误的方法。如果有办法,我已经把问题留了下来,因为它可能会在未来帮助某人……但对我来说,我需要先重新考虑数据结构。
解决方案
推荐阅读
- javascript - 从 node.js 中的 http 服务器调用时,DynamoDB 查询返回空对象
- magento2 - 如何在 Magento 2 中获取类别的自定义属性
- php - 表单不提交,它在非www.domain中提交,当它带有www时,它只会重新加载页面
- playframework - 如何在 play 框架中限制不安全的 http 请求
- r - 在 R 中格式化数字
- java - 工具正在延迟 Eclipse 插件开发中的输出
- amazon-web-services - S3 存储桶策略允许 S3 访问 AWS 控制台中当前经过身份验证的用户?
- typescript - Pulumi 根据选择的栈修改 kubernetes 资源
- oracle - 我们可以在 OBIEE 中创建带有时间线的动态信息图表吗?
- java - 实现DnD时如何让jtable transferhandler高亮一行?