2011-06-01 215 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文件。

相关问题