2011-06-01 214 views
3

我有一個非常複雜的任務 - 創建一個將XMl文件導入MSSQL數據庫的軟件。有一個嚴重的問題 - 每個文件的結構都不同於數據表。例如:將XML導入到SQL Server數據庫

數據庫: 它列,如:IMAGEURL,標題,內容

XML: 每個XML文件是不同的,我給你兩個例子:

  1. <contents> 
        <ImageURL>www.123.com/image.png</ImageURL> 
        <Title>Some text</title> 
        <Content>Content of item</Content> 
    </contents> 
    <contents> 
        <ImageURL>www.123.com/image.png</ImageURL> 
        <Title>Some text</title> 
        <Content>Content of item</Content> 
    </contents> 
    

2.

<item imageURL="url" title="title" content="content"> 

有沒有開源的解決方案呢?

* UPDATE *

我忘了告訴你,我會在下面的步驟來使用此代碼與ASP.NET應用程序:

  1. 用戶選擇XML的網址他想要導入的文件
  2. 用戶將選擇他想要導入到GUI中的數據庫的標籤
  3. 後面的代碼,導入當前文件的規則將被創建並存儲到數據庫。

任何提示/技巧如何以最簡單的方式實現這一目標?如果你沒有源代碼,請給我一些提示。謝謝 請注意,每個文件都有不同的結構

回答

3

您需要弄清楚您擁有的不同版本,並編寫一些代碼來處理每個xml結構。

您可以在SQL Server做這樣

1:

declare @XML xml 

set @XML = 
'<contents> 
    <ImageURL>www.123.com/image.png</ImageURL> 
    <Title>Some text</Title> 
    <Content>Content of item</Content> 
</contents> 
<contents> 
    <ImageURL>www.123.com/image.png</ImageURL> 
    <Title>Some text</Title> 
    <Content>Content of item</Content> 
</contents>' 

select 
    N.value('ImageURL[1]', 'varchar(max)') as ImageURL, 
    N.value('Title[1]', 'varchar(max)') as Title, 
    N.value('Content[1]', 'varchar(max)') as Content 
from @XML.nodes('/contents') as T(N) 

結果:

ImageURL    Title  Content 
--------------------- --------- --------------- 
www.123.com/image.png Some text Content of item 
www.123.com/image.png Some text Content of item 

2:

declare @XML xml 
set @XML = '<item imageURL="url" title="title" content="content"></item>' 

select 
    N.value('@imageURL', 'varchar(max)') as ImageURL, 
    N.value('@title', 'varchar(max)') as Title, 
    N.value('@content', 'varchar(max)') as Content 
from @XML.nodes('item') as T(N) 

結果:

ImageURL Title  Content 
-------- -----  ------- 
url  title  content 

3.

declare @XML xml 

set @XML = 
'<contents> 
    <content> 
    <someOtherNode> 
     <ImageURL>www.FirstURL.com/image.png</ImageURL> 
    </someOtherNode> 
    </content> 
</contents> 
<contents> 
    <content> 
    <someOtherNode> 
     <ImageURL>www.SecondURL.com/image.png</ImageURL> 
    </someOtherNode> 
    </content> 
</contents>' 

select 
    N.value('ImageURL[1]', 'varchar(max)') as ImageURL 
from @XML.nodes('/contents/content/someOtherNode') as T(N) 

結果:

ImageURL 
--------------------------- 
www.FirstURL.com/image.png 
www.SecondURL.com/image.png 

4.

declare @XML xml 

set @XML = 
'<content> 
    <imageURL> 
    <url>first url</url> 
    </imageURL> 
    <info> 
    <title>title 1</title> 
    <text>text 1</text> 
    </info> 
</content> 
<content> 
    <imageURL> 
    <url>second url</url> 
    </imageURL> 
    <info> 
    <title>title 2</title> 
    <text>text 2</text> 
    </info> 
</content>' 

select 
    N.value('imageURL[1]/url[1]', 'varchar(max)') as ImageURL, 
    N.value('info[1]/title[1]', 'varchar(max)') as Title, 
    N.value('info[1]/text[1]', 'varchar(max)') as Content 
from @XML.nodes('/content') as T(N) 

結果:

ImageURL Title Content 
--------- ------- ------- 
first url title 1 text 1 
second url title 2 text 2 
+0

問題:在第一個示例中,您爲什麼選擇'Title [1]'而不是'Title'? – 2011-06-01 11:59:18

+0

@Branislav - 'value'只能返回1個元素的值。 *我們知道只有一個,但解析器不知道,所以'[1]'告訴'value'函數選擇第一個出現的'Title'。 – 2011-06-01 12:06:49

+0

是否適用於每個CONTENTS元素? – 2011-06-02 12:06:11

1

您是否手動導入這些文件?

您已經標記了這個C#,所以我假設你想要寫的東西。

我會;

  • 創建一個Windows窗體或WPF應用程序,
    使用opendialog和選擇文件/秒 要導入。
    • 對於每個文件,檢查某些節點的存在,以確定哪些
      文件我正在讀
    • 使用LINQ查詢

出物品進入對象的列表;

public class ContentItem 
{ 
    public string ImageUrl [get;set;} 
    public string Title {get;set;} 
    public string Content {get;set;} 
} 
  • 遍歷你的對象的列表,並 將它們插入到數據庫中。
+0

我不完全瞭解您的解決方案 – 2011-06-02 11:45:50

0

您可以將所有其他格式(例如使用xsl)轉換爲標準xml(例如,您決定標準模式就像1例子)。就像那樣,你只需要決定使用哪個轉換用於非標準的xml文件。

相關問題