0

以下のsoap応答には、約5000行の製品の表が含まれています。製品の表(以下)は、xmlデータとほぼ同様の構造です。

Productsテーブルは、1時間ごとにxmlデータから更新する必要があります。

このxmlデータを製品のテーブルに追加するにはどうすればよいですか?

PostgreSql xpath()関数または他のideを使用する必要がありますか?ASP .NET / MonoでのnpgsqlとC#の使用。

CREATE TABLE products (
SupplierCode char(20) primary key,
SegmentId char(8),
GroupId char(8),
ClassId char(8),
SeriesId char(8),
VendorId char(2),
PartNumbrt char(27),
Name Text,
Warranty Numeric(6,2),
Price Numeric(10,4),
Quantity Numeric(8,2)
)

追加する必要がある石鹸の応答は次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
xmlns:xsd="http://www.w3.org/2001/XMLSchema"; xmlns:soap12="http://www.w3.org/2003/05/soapenvelope";>
<soap12:Body>
<GetProductListResponse xmlns="http://xxx.yy.zz/";>
<GetProductListResult>
<ProductList>
<Product>
<SupplierCode>001982</SupplierCode>
<SegmentId>65000000</SegmentId>
<GroupId>65010000</GroupId>
<ClassId>65010200</ClassId>
<SeriesId>10001125</SeriesId>
<VendorId>AM</VendorId>
<PartNumber>ADA3000BIBOX</PartNumber>
<Name>AMD Athlon64 3000+ (1800MHz/L2 Cache 512KB) Socket 939, BOX</Name>
<Warranty>36</Warranty>
<Price>196.00000</Price>
<Quantity>0</Quantity>
<DateExpected>1999-01-01T00:00:00</DateExpected>
<IsNewProduct>true</IsNewProduct>
</Product>
<Product>
<SupplierCode>001512</SupplierCode>
<SegmentId>65000000</SegmentId>
<GroupId>65010000</GroupId>
<ClassId>65010200</ClassId>
<SeriesId>10001125</SeriesId>
<VendorId>AM</VendorId>
Acme API Specification v 1.0
13
<PartNumber>ADA3000AXBOX</PartNumber>
<Name>AMD Athlon64 3000+ (2000MHz/1600MHz/L2 Cache 512KB) Socket 754, BOX</Name>
<Warranty>36</Warranty>
<Price>296.00000</Price>
<Quantity>0</Quantity>
<GrossWeight>3.6000</GrossWeight>
<DateExpected>1999-01-01T00:00:00</DateExpected>
<IsNewProduct>false</IsNewProduct>
</Product>
</ProductList>
</GetProductListResult>
</GetProductListResponse>
</soap12:Body>
</soap12:Envelope>
4

1 に答える 1

1

簡単にするために、最初にXMLをステージングテーブルにインポートします。

CREATE TABLE xml_import
(
   xml_data  xml
)

次に、ステージングテーブルにデータを入力したら、SQLステートメントを使用してステージングテーブルからデータを取得し、XMLをリレーショナル表現に変換できます。

with product_list as (
  select unnest(xpath('/soap12:Envelope/soap12:Body/pl:GetProductListResponse/pl:GetProductListResult/pl:ProductList/pl:Product', xml_data, 
          ARRAY[ array['xsd', 'http://www.w3.org/2001/XMLSchema-instance'], 
                 array['soap12', 'http://www.w3.org/2003/05/soapenvelope'], 
                 array['pl', 'http://xxx.yy.zz/']])) as product
  from xml_import
)
select (xpath('/Product/SupplierCode/text()', product)::varchar[])[1] as suppliercode, 
       (xpath('/Product/SegmentId/text()', product)::varchar[])[1] as segmentid,
       (xpath('/Product/PartNumber/text()', product)::varchar[])[1] as partnumber,
       to_number((xpath('/Product/Price/text()', product)::varchar[])[1], '99999.99999') as price,
       to_number((xpath('/Product/GrossWeight/text()', product)::varchar[])[1], '9999.9999') as weight
from product_list

わざわざすべての列を含めることはしませんでしたが、画像が表示されると思います。

上記のステートメントをビューに入れると、ビューを使用して実際の商品テーブルにデータを入力できます。

そのステージングテーブルを作成したくない場合は、おそらくすべてを1つのステートメントにまとめることができます。

with xml_import (xml_data) as ( 
   select '.... xml goes here '::xml
), 
product_list as (
  ... same as above ...
)
select ... same as above ...
from product_list
于 2011-10-08T15:27:53.843 に答える