将XML导入到SQL Server数据库
问题描述:
我有一个非常复杂的任务 - 创建一个将XMl文件导入MSSQL数据库的软件。有一个严重的问题 - 每个文件的结构都不同于数据表。例如:将XML导入到SQL Server数据库
数据库: 它列,如:IMAGEURL,标题,内容
XML: 每个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>
2.
<item imageURL="url" title="title" content="content">
有没有开源的解决方案呢?
* UPDATE *
我忘了告诉你,我会在下面的步骤来使用此代码与ASP.NET应用程序:
- 用户选择XML的网址他想要导入的文件
- 用户将选择他想要导入到GUI中的数据库的标签
- 后面的代码,导入当前文件的规则将被创建并存储到数据库。
任何提示/技巧如何以最简单的方式实现这一目标?如果你没有源代码,请给我一些提示。谢谢 请注意,每个文件都有不同的结构
答
您需要弄清楚您拥有的不同版本,并编写一些代码来处理每个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
答
您是否手动导入这些文件?
您已经标记了这个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
答
您可以将所有其他格式(例如使用xsl)转换为标准xml(例如,您决定标准模式就像1例子)。就像那样,你只需要决定使用哪个转换用于非标准的xml文件。
问题:在第一个示例中,您为什么选择'Title [1]'而不是'Title'? – 2011-06-01 11:59:18
@Branislav - 'value'只能返回1个元素的值。 *我们知道只有一个,但解析器不知道,所以'[1]'告诉'value'函数选择第一个出现的'Title'。 – 2011-06-01 12:06:49
是否适用于每个CONTENTS元素? – 2011-06-02 12:06:11