Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PostgreSQL中从JSON数组创建XML_Json_Postgresql - Fatal编程技术网

在PostgreSQL中从JSON数组创建XML

在PostgreSQL中从JSON数组创建XML,json,postgresql,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结果: 3455 我的产品1 4. 90 3455 我的

我有一个包含如下数据的列的表: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结果:


3455
我的产品1
4.
90
3455
我的产品2
5.
80
实现这一目标的最佳方式是什么


谢谢大家!

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

DROP TYPE(如果存在项目类型);
创建类型项\u类型
AS(“ref”int,“desc”VARCHAR(500),价格浮动,数量整数);
--ref和desc是SQL关键字
--因此,您需要指定它们实际上是列名
演示表如下所示:

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记录 (JSON数组中的
项类型
)使用,(2)使用创建
节点的内容,(3)使用创建
元素本身,(4)使用聚合
元素,使用
xmlelement
创建根元素


-它运行,但看起来SQLFIDLE在输出XML结果时遇到问题,因此我将结果转换为
文本

在我的解决方案中,我假定JSON数组中的对象具有相同的结构。因此,我们为该对象创建一个SQL
类型

DROP TYPE(如果存在项目类型);
创建类型项\u类型
AS(“ref”int,“desc”VARCHAR(500),价格浮动,数量整数);
--ref和desc是SQL关键字
--因此,您需要指定它们实际上是列名
演示表如下所示:

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记录 (JSON数组中的
项类型
)使用,(2)使用创建
节点的内容,(3)使用创建
元素本身,(4)使用聚合
元素,使用
xmlelement
创建根元素


-它正在运行,但看起来SQLFIDLE在输出XML结果时遇到问题,因此我将结果转换为
文本

请回答您的问题,并根据示例数据添加预期的输出。请注意,Postgres中没有专门的工具来将json转换为xml。我认为这种转换在客户端应用程序中可能非常容易。用您喜爱的语言搜索解决方案,例如,请回答您的问题,并根据您的样本数据添加预期输出。请注意,Postgres中没有专门的工具来将json转换为xml。我认为这种转换在客户端应用程序中可能非常容易。用您喜爱的语言搜索解决方案,例如@user3643038如果答案对您有帮助,请接受并向上投票。@user3643038如果答案对您有帮助,请接受并向上投票。