使用 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 格式。

任何帮助或指导将不胜感激。

问候 阿卜杜勒阿齐姆

基本上,这个问题的细分如下:

这里唯一棘手的事情是将 keyvalue 对从 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;