在PostgreSQL中用JSON数组创建XML

时间:2017-11-08 12:29:51

标签: json postgresql

我有一个表,其中包含一个包含如下数据的列:n个json元素的数组

[
  {"ref":"3455","desc":"My Product 1","price":"4","quant":"90"},
  {"ref":"3455","desc":"My Product 2","price":"5","quant":"80"}
]

我需要解析/迭代每个JSON元素。在示例中,我有2.结果将是一个自定义字符串(实际上是XML字符串)。

预期的XML结果:

<items>
  <item>
    <ref>3455</ref>
    <desc>My Product 1</desc>
    <price>4</price>
    <quant>90</quant>
  </item>
  <item>
    <ref>3455</ref>
    <desc>My Product 2</desc>
    <price>5</price>
    <quant>80</quant>
  </item>
</items>

实现这一目标的最佳方法是什么?

谢谢你!

1 个答案:

答案 0 :(得分:0)

在我的解决方案中,我假设JSON数组中的对象具有相同的结构。因此,我们为这些对象创建了一个SQL type

DROP TYPE IF EXISTS item_type;
CREATE TYPE item_type 
  AS ("ref" int, "desc" VARCHAR(500), price FLOAT, quant INTEGER);
--ref and desc are SQL key words 
--so you need to specify that they actually are column names

演示表如下所示:

CREATE TABLE items
(
    id SERIAL NOT NULL
        CONSTRAINT items_pkey
            PRIMARY KEY,
    content jsonb DEFAULT '[]'::jsonb NOT NULL
);

查询:

SELECT xmlelement(name items, (--create the root element "items"
  SELECT xmlagg(--aggregate "item" elements
      xmlelement(NAME item, --create "item" elements
                 xmlforest(t."ref", t."desc", t.price, t.quant)--create "item" element content
      )
  )
  FROM
    (
      SELECT (jsonb_populate_recordset(NULL :: item_type, items.content)).*--create records ot of JSON array
      FROM items
      WHERE items.id = 1 --you can remove where if you want all rows
    ) AS t
))

<强>解释
从里到外; (1)创建我们之前创建的类型的SQL记录 (item_type)使用jsonb_populate_recordset从JSON数组中取出,{2}使用xmlforest创建<item>个节点的内容,(3)创建<item> }元素本身使用xmlelement,(4)使用xmlagg汇总<item>元素,使用<items>创建根元素xmlelement

SQLFiddle - 它运行但看起来SQLFiddle在输出XML结果时出现问题,因此我将结果转换为TEXT