使用 postgresql 将 xml 转换为 json
converting xml to json using postgresql
我正在使用 PostgreSQL 将 XML 转换为 j 子字符串。
我们有 attributecentric XML 并且想知道如何将它转换为 j son.
示例 XML:
<ROOT><INPUT id="1" name="xyz"/></ROOT>
需要获取j子如下:
{ "ROOT": { "INPUT": { "id": "1", "name": "xyz" }}}
从在线工具中得到上述 json 格式。
任何帮助或指导将不胜感激。
问候
阿卜杜勒阿齐姆
基本上,这个问题的细分如下:
- 使用
xpath()
函数 从给定的 XML
中提取值
- 使用
json_object_agg()
函数生成并合并 JSON
个条目
这里唯一棘手的事情是将 key
、value
对从 xpath()/json_object_agg()
结果组合在一起,即 { "id": "1"}
和 { "name" : "xyz"}
。
WITH test_xml(data) AS ( VALUES
('<ROOT><INPUT id="1" name="xyz"/></ROOT>'::XML)
), attribute_id(value) AS (
-- get '1' value from id
SELECT (xpath('//INPUT/@id',test_xml.data))[1] AS value
FROM test_xml
), attribute_name(value) AS (
-- get 'xyz' value from name
SELECT (xpath('//INPUT/@name',test_xml.data))[1] AS value
FROM test_xml
), json_1 AS (
-- generate JSON 1 {"id": "1"}
SELECT json_object_agg('id',attribute_id.value) AS payload
FROM attribute_id
), json_2 AS (
-- generate JSON 2 {"name" : "xyz"}
SELECT json_object_agg('name',attribute_name.value) AS payload FROM attribute_name
), merged AS (
-- Generate INPUT result - Step 1 - combine JSON 1 and 2 as single key,value source
SELECT key,value
FROM json_1,json_each(json_1.payload)
UNION ALL
SELECT key,value
FROM json_2,json_each(json_2.payload)
), input_json_value AS (
-- Generate INPUT result - Step 2 - use json_object_agg to create JSON { "id" : "1", "name" : "xyz" }
SELECT json_object_agg(merged.key,merged.value) AS data
FROM merged
), input_json AS (
-- Generate INPUT JSON as expected { "INPUT" : { "id" : "1", "name" : "xyz" } }
SELECT json_object_agg('INPUT',input_json_value.data) AS data
FROM input_json_value
)
-- Generate final reult
SELECT json_object_agg('ROOT',input_json.data)
FROM input_json;
我正在使用 PostgreSQL 将 XML 转换为 j 子字符串。 我们有 attributecentric XML 并且想知道如何将它转换为 j son.
示例 XML:
<ROOT><INPUT id="1" name="xyz"/></ROOT>
需要获取j子如下:
{ "ROOT": { "INPUT": { "id": "1", "name": "xyz" }}}
从在线工具中得到上述 json 格式。
任何帮助或指导将不胜感激。
问候 阿卜杜勒阿齐姆
基本上,这个问题的细分如下:
- 使用
xpath()
函数 从给定的 - 使用
json_object_agg()
函数生成并合并JSON
个条目
XML
中提取值
这里唯一棘手的事情是将 key
、value
对从 xpath()/json_object_agg()
结果组合在一起,即 { "id": "1"}
和 { "name" : "xyz"}
。
WITH test_xml(data) AS ( VALUES
('<ROOT><INPUT id="1" name="xyz"/></ROOT>'::XML)
), attribute_id(value) AS (
-- get '1' value from id
SELECT (xpath('//INPUT/@id',test_xml.data))[1] AS value
FROM test_xml
), attribute_name(value) AS (
-- get 'xyz' value from name
SELECT (xpath('//INPUT/@name',test_xml.data))[1] AS value
FROM test_xml
), json_1 AS (
-- generate JSON 1 {"id": "1"}
SELECT json_object_agg('id',attribute_id.value) AS payload
FROM attribute_id
), json_2 AS (
-- generate JSON 2 {"name" : "xyz"}
SELECT json_object_agg('name',attribute_name.value) AS payload FROM attribute_name
), merged AS (
-- Generate INPUT result - Step 1 - combine JSON 1 and 2 as single key,value source
SELECT key,value
FROM json_1,json_each(json_1.payload)
UNION ALL
SELECT key,value
FROM json_2,json_each(json_2.payload)
), input_json_value AS (
-- Generate INPUT result - Step 2 - use json_object_agg to create JSON { "id" : "1", "name" : "xyz" }
SELECT json_object_agg(merged.key,merged.value) AS data
FROM merged
), input_json AS (
-- Generate INPUT JSON as expected { "INPUT" : { "id" : "1", "name" : "xyz" } }
SELECT json_object_agg('INPUT',input_json_value.data) AS data
FROM input_json_value
)
-- Generate final reult
SELECT json_object_agg('ROOT',input_json.data)
FROM input_json;