将XML导入SQL Server数据库
本文关键字:Server 数据库 SQL 导入 XML | 更新日期: 2023-09-27 17:58:04
我有一项非常复杂的任务——创建一个将XMl文件导入MSSQL数据库的软件。有一个严重的问题——每个文件都有不同于数据表的结构。示例:
数据库:它有如下列: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">
有什么开源的解决方案吗?
*更新*
我忘了让你知道,我将在以下步骤中在ASP.NET应用程序中使用此代码:
- 用户选择要导入的XML文档的url
- 用户可以在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;}
}
- 循环浏览对象列表将它们插入数据库
您可以将所有其他格式转换(例如使用xsl)为您的标准xml(例如,您决定标准模式与1个示例相同)。像这样,您只需要决定对非标准xml文件使用哪种转换。