2015-11-09 50 views
1

我正在使用PostgreSQL将XML转换为j儿子字符串。 我们有属性为中心的XML,并想知道如何将其转换为j儿子。使用postgresql将xml转换为json

示例XML:

<ROOT><INPUT id="1" name="xyz"/></ROOT> 

需要得到第j儿子如下:

{ "ROOT": { "INPUT": { "id": "1", "name": "xyz" }}} 

接到了一个在线工具,上面的JSON格式。

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

问候 阿卜杜勒Azeem

+1

你已经试过了什么? –

+0

我已经尝试使用array_to_json(array_agg(row_to_json(a)))。但输出是以元素为中心而不是以属性为中心的。 – Azzu

回答

1

基本上,这个问题的击穿如下:使用从给定XML

The唯一棘手的是这里的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; 
+1

对于一个小的XML我不得不写这么大的代码。 –