2017-11-08 7 views
1

にJSON配列からXMLを作成する私はこのようなデータを含む列を持つテーブルを有する:n個のJSON要素のアレイは、PostgreSQL

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

Iは、反復/ 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> 

これを達成するための最良の方法は何ですか?

ありがとうございました!

+0

**あなたの質問に** [EDIT] **し、サンプルデータに基づいて予想される出力を追加してください。 [**フォーマットされたテキスト**](http://stackoverflow.com/help/formatting)、** **スクリーンショットはありません**(http://meta.stackoverflow.com/questions/285551/why-may -i-not-upload-images-of-code-on-so-asking-a-question/285557#285557)。 –

+0

jsonをxmlに変換する専用のツールはありません。私はそのような変換は、クライアントアプリケーションでは本当に簡単かもしれないと思う。お気に入りの言語でソリューションを検索します(例: [PythonでJSONをXMLに変換する](0120-333,2005) – klin

答えて

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)我々はjsonb_populate_recordsetを使用して、以前 JSON配列のうち(item_type)を作成したタイプのSQLレコードを作成、(2)(3)xmlelementを用い<item>要素自体を作成し、xmlforestを用い<item>ノードのコンテンツを作成し、( 4)<item>要素をxmlaggを使用して集計し、を使用してルート要素<items>を作成します。

SQLFiddle - それは実行されますが、SQLFiddleのようにXML結果を出力するのに問題がありますので、結果をTEXTにキャストします。

+0

ありがとうございました! – user3643038

+0

@ user3643038あなたのお手伝いをした場合は、受け入れて投票してください。 – Dmitry