2011-10-08 87 views
0

下面的soap響應包含產品表,約5000行。 產品表(下)與xml數據結構幾乎相似。如何將xml數據添加到postgresql數據庫

產品表需要每小時從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) 
) 
這是需要添加的樣子

SOAP響應:

<?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> 
+0

密切相關:http://stackoverflow.com/questions/7491479/xml-data -to-的PostgreSQL數據庫 –

回答

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 

我並不打算包括所有列,但我想你會得到這張照片。

我會把上面的語句放到一個視圖中,然後你可以簡單地使用視圖來填充你的真實產品表。

如果您不希望創建臨時表,你可能可以把一切都變成一條語句:

with xml_import (xml_data) as ( 
    select '.... xml goes here '::xml 
), 
product_list as (
    ... same as above ... 
) 
select ... same as above ... 
from product_list