将XML导入SQL Server数据库

本文关键字:Server 数据库 SQL 导入 XML | 更新日期: 2023-09-27 17:58:04

我有一项非常复杂的任务——创建一个将XMl文件导入MSSQL数据库的软件。有一个严重的问题——每个文件都有不同于数据表的结构。示例:

数据库:它有如下列: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">

有什么开源的解决方案吗?

*更新*

我忘了让你知道,我将在以下步骤中在ASP.NET应用程序中使用此代码:

  1. 用户选择要导入的XML文档的url
  2. 用户可以在GUI中选择要导入数据库的标签
  3. 在代码隐藏中,将创建用于导入当前文件的规则并将其存储到数据库中

如何以最简单的方式实现这一点,有什么技巧吗?如果您没有源代码,请给我一些提示。谢谢注意每个文件都有不同的结构

将XML导入SQL Server数据库

您需要找出不同的版本,并编写一些代码来处理每个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文件使用哪种转换。