2016-09-23 87 views
0

我正在尋找將我的XmlFile加載到Sql-Server,我將使用sqlbulkcopy,但我不知道如何將我的XmlFile轉換爲DataSet,因爲它們有很多imbriqued表。這裏是我的XmlFile,並且提前感謝你。將XmlFile加載到Sql-server

<?xml version="1.0" encoding="utf-8"?> 
<data> 
<data> 
<created_time>2016-09-23T22:37:33+01:00</created_time> 
<id>12451</id>  
<message>Cool</message> 
<from> 
    <id>1</id> 
    <name>user1</name> 
    <picture> 
    <data> 
     <is_silhouette>false</is_silhouette> 
     <url>https://server.com/pic.jpg</url> 
    </data> 
    </picture> 
</from> 
<comments> 
    <data> 
    <created_time>2016-09-23T22:46:59+01:00</created_time>  
    <id>112</id>   
    <message>ok</message> 
    <from> 
     <id>1245</id> 
     <name>reply user1</name> 
     <picture> 
     <data> 
      <is_silhouette>false</is_silhouette> 
      <url>https://server.com/pic2.jpg</url> 
     </data> 
     </picture> 
    </from> 
    </data> 
    <data> 
    <created_time>2016-09-23T22:47:41+01:00</created_time>  
    <id>113</id>   
    <message>nice</message> 
    <from> 
     <id>1246</id> 
     <name>reply user2</name> 
     <picture> 
     <data> 
      <is_silhouette>false</is_silhouette> 
      <url>https://server.com/pic3.jpg</url> 
     </data> 
     </picture> 
    </from> 
    </data>  
    <paging> 
    <cursors> 
     <before>sdfdfdsfdfdsfdsf</before> 
     <after>dsfdsfdfsfdffdfdf</after> 
    </cursors> 
    </paging> 
</comments> 
</data> 
<data> 
<created_time>2016-09-23T22:35:20+01:00</created_time>  
<id>47854</id>  
<message>Thank you</message> 
<from> 
    <id>365</id> 
    <name>user2</name> 
    <picture> 
    <data> 
     <is_silhouette>false</is_silhouette> 
     <url>https://server.com/pic4.jpg</url> 
    </data> 
    </picture> 
</from> 
<comments>  
    <data> 
    <created_time>2016-09-23T22:47:05+01:00</created_time> 
    <id>1285</id>   
    <message>what?</message> 
    <from> 
     <id>33</id> 
     <name>reply user1</name> 
     <picture> 
     <data> 
      <is_silhouette>false</is_silhouette> 
      <url>https://server.com/pic5.jpg</url> 
     </data> 
     </picture> 
    </from> 
    </data> 
    <data> 
    <created_time>2016-09-23T22:55:54+01:00</created_time> 
    <id>1982</id>   
    <message>No.</message> 
    <from> 
     <id>102</id> 
     <name>reply user2</name> 
     <picture> 
     <data> 
      <is_silhouette>false</is_silhouette> 
      <url>https://server.com/pic6.jpg</url> 
     </data> 
     </picture> 
    </from> 
    </data>  
    </comments> 
</data>  
</data> 
+0

您是否嘗試過使用簡單方法(ds.ReadXml(myXMLfile);),如http://stackoverflow.com/q/3491347/6741942上的問題所述我認爲DataSet會自動確定架構。 – strongbutgood

+0

using(ds.ReadXml(myXMLfile);給我錯誤「同一個表(數據)不能是兩個嵌套關係中的子表」 – hansly

回答

0

最後,沒問題,解決方法是將XmlFile加載到MS-SQL服務器。在我的C#程序我使用這個命令:

cmd.CommandText = "Insert into Table_fileXml(xml) SELECT CONVERT(XML, BulkColumn) AS BulkColumn From OPENROWSET(BULK 'd:\\XmlFile.xml', SINGLE_BLOB) AS X"; 

cmd.ExecuteNonQuery(); 

cmd.Parameters.Clear(); 

最後創建一個觸發器,將執行一個存儲過程後,我的文件XMLFILE將被插入到我的MS-SQL Server數據庫:

USE [DatabaseName] 
GO 

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER TRIGGER [dbo].[trigger1] 
ON [dbo].[Table_FileXml] 
AFTER INSERT 
AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

-- Insert statements for trigger here 

DECLARE @xml xml 
SELECT top(1) @xml=xml FROM Table_fileXml ORDER BY id DESC 

SELECT data.value('created_time[1]','datetime') AS Data_CreatedTime 
    ,data.value('id[1]','nvarchar(max)') AS Data_Id 
    ,data.value('message[1]','nvarchar(max)') AS Data_Message 
    ,data.value('(from/id)[1]','nvarchar(50)') AS Data_From_Id 
    --more values here 
    ,data.value('(from/picture/data/url)[1]','nvarchar(max)') AS Data_From_Picture_URL 
    --more values here 

    ,comment.value('created_time[1]','datetime') AS Comment_CreatedTime 
    ,comment.value('id[1]','nvarchar(max)') AS Comment_Id 
    ,comment.value('message[1]','nvarchar(max)') AS Comment_Message 
    ,comment.value('(from/id)[1]','nvarchar(50)') AS Comment_From_Id 
    --more values here 
    ,comment.value('(from/picture/data/url)[1]','nvarchar(max)') AS Comment_From_Picture_URL 
    --more values here 

FROM @xml.nodes('/data/data') AS A(data) 
OUTER APPLY data.nodes('comments/data') AS B(comment) 
BEGIN 
DECLARE @xml2 xml 
SELECT top(1) @xml2=xml FROM Table_fileXml ORDER BY id DESC 
INSERT INTO Table_comment(from_id,from_pic,comment_message) 
SELECT DISTINCT comment.value('(from/id)[1]','nvarchar(50)') AS from_id, 
data.value('(from/picture/data/url)[1]','nvarchar(max)') AS from_pic, 
comment.value('message[1]','nvarchar(max)') AS comment_message 
FROM @xml2.nodes('/data/data') AS A(data) 
OUTER APPLY data.nodes('comments/data') AS B(comment) 
END 
END 

結果是正確的。只使用沒有存儲過程的觸發器,給我一個來自我的FileXML的最後一行。這就是爲什麼我必須使用帶觸發器的存儲過程。

謝謝你「Shnugo」,「Martin Staufcik」和「Abouzar」的寶貴幫助。

0

您可以創建varbinary(max)類型的數據庫列將映射到byte[]財產在你的領域模型。然後使用XmlWriter將XML文檔存儲到此列中。

public virtual void Save(
    XmlWriter w 
) 
+0

我想分解Xml文件並將屬性和元素存儲在不同的列中。」數據「放到一個表中,並且」註釋「到第二個表中。 – hansly

+0

也許問題是元素'data'在根級和也可以在註釋節點中,你可以重命名其中的一個,然後你應該沒問題。 –

0

通過以下查詢,您將從派生表中獲取XML中的所有數據。

應該很容易將其插入適當的表格中。提示:

SELECT DISTINCT ... 
SELECT col1, col2 INTO #tbl ... 
INSERT INTO tbl SELECT col1, col2, ... 

和創造,你可能會使用類似ROW_NUMBER() OVER()與配合PARTITION BY ID的...

你的XML

DECLARE @xml XML= 
'<?xml version="1.0" encoding="utf-8"?> 
<data> 
<data> 
<created_time>2016-09-23T22:37:33+01:00</created_time> 
<id>12451</id>  
<message>Cool</message> 
<from> 
    <id>1</id> 
    <name>user1</name> 
    <picture> 
    <data> 
     <is_silhouette>false</is_silhouette> 
     <url>https://server.com/pic.jpg</url> 
    </data> 
    </picture> 
</from> 
<comments> 
    <data> 
    <created_time>2016-09-23T22:46:59+01:00</created_time>  
    <id>112</id>   
    <message>ok</message> 
    <from> 
     <id>1245</id> 
     <name>reply user1</name> 
     <picture> 
     <data> 
      <is_silhouette>false</is_silhouette> 
      <url>https://server.com/pic2.jpg</url> 
     </data> 
     </picture> 
    </from> 
    </data> 
    <data> 
    <created_time>2016-09-23T22:47:41+01:00</created_time>  
    <id>113</id>   
    <message>nice</message> 
    <from> 
     <id>1246</id> 
     <name>reply user2</name> 
     <picture> 
     <data> 
      <is_silhouette>false</is_silhouette> 
      <url>https://server.com/pic3.jpg</url> 
     </data> 
     </picture> 
    </from> 
    </data>  
    <paging> 
    <cursors> 
     <before>sdfdfdsfdfdsfdsf</before> 
     <after>dsfdsfdfsfdffdfdf</after> 
    </cursors> 
    </paging> 
</comments> 
</data> 
<data> 
<created_time>2016-09-23T22:35:20+01:00</created_time>  
<id>47854</id>  
<message>Thank you</message> 
<from> 
    <id>365</id> 
    <name>user2</name> 
    <picture> 
    <data> 
     <is_silhouette>false</is_silhouette> 
     <url>https://server.com/pic4.jpg</url> 
    </data> 
    </picture> 
</from> 
<comments>  
    <data> 
    <created_time>2016-09-23T22:47:05+01:00</created_time> 
    <id>1285</id>   
    <message>what?</message> 
    <from> 
     <id>33</id> 
     <name>reply user1</name> 
     <picture> 
     <data> 
      <is_silhouette>false</is_silhouette> 
      <url>https://server.com/pic5.jpg</url> 
     </data> 
     </picture> 
    </from> 
    </data> 
    <data> 
    <created_time>2016-09-23T22:55:54+01:00</created_time> 
    <id>1982</id>   
    <message>No.</message> 
    <from> 
     <id>102</id> 
     <name>reply user2</name> 
     <picture> 
     <data> 
      <is_silhouette>false</is_silhouette> 
      <url>https://server.com/pic6.jpg</url> 
     </data> 
     </picture> 
    </from> 
    </data>  
    </comments> 
</data>  
</data>'; 

查詢

SELECT data.value('created_time[1]','datetime') AS Data_CreatedTime 
     ,data.value('id[1]','int') AS Data_Id 
     ,data.value('message[1]','nvarchar(max)') AS Data_Message 
     ,data.value('(from/id)[1]','int') AS Data_From_Id 
     --more values here 
     ,data.value('(from/picture/data/url)[1]','nvarchar(max)') AS Data_From_Picture_URL 
     --more values here 

     ,comment.value('created_time[1]','datetime') AS Comment_CreatedTime 
     ,comment.value('id[1]','int') AS Comment_Id 
     ,comment.value('message[1]','nvarchar(max)') AS Comment_Message 
     ,comment.value('(from/id)[1]','int') AS Comment_From_Id 
     --more values here 
     ,comment.value('(from/picture/data/url)[1]','nvarchar(max)') AS Comment_From_Picture_URL 
     --more values here 
FROM @xml.nodes('/data/data') AS A(data) 
OUTER APPLY data.nodes('comments/data') AS B(comment) 

結果

+-------------------------+---------+--------------+--------------+-----------------------------+-------------------------+------------+-----------------+-----------------+-----------------------------+ 
| Data_CreatedTime  | Data_Id | Data_Message | Data_From_Id | Data_From_Picture_URL  | Comment_CreatedTime  | Comment_Id | Comment_Message | Comment_From_Id | Comment_From_Picture_URL | 
+-------------------------+---------+--------------+--------------+-----------------------------+-------------------------+------------+-----------------+-----------------+-----------------------------+ 
| 2016-09-23 21:37:33.000 | 12451 | Cool   | 1   | https://server.com/pic.jpg | 2016-09-23 21:46:59.000 | 112  | ok    | 1245   | https://server.com/pic2.jpg | 
+-------------------------+---------+--------------+--------------+-----------------------------+-------------------------+------------+-----------------+-----------------+-----------------------------+ 
| 2016-09-23 21:37:33.000 | 12451 | Cool   | 1   | https://server.com/pic.jpg | 2016-09-23 21:47:41.000 | 113  | nice   | 1246   | https://server.com/pic3.jpg | 
+-------------------------+---------+--------------+--------------+-----------------------------+-------------------------+------------+-----------------+-----------------+-----------------------------+ 
| 2016-09-23 21:35:20.000 | 47854 | Thank you | 365   | https://server.com/pic4.jpg | 2016-09-23 21:47:05.000 | 1285  | what?   | 33    | https://server.com/pic5.jpg | 
+-------------------------+---------+--------------+--------------+-----------------------------+-------------------------+------------+-----------------+-----------------+-----------------------------+ 
| 2016-09-23 21:35:20.000 | 47854 | Thank you | 365   | https://server.com/pic4.jpg | 2016-09-23 21:55:54.000 | 1982  | No.    | 102    | https://server.com/pic6.jpg | 
+-------------------------+---------+--------------+--------------+-----------------------------+-------------------------+------------+-----------------+-----------------+-----------------------------+