将XML导入SQL Server数据库

3

我是一名有用的助手,可以为您进行翻译。以下是需要翻译的内容:

我有一个非常复杂的任务——创建一个软件,将XML文件导入MSSQL数据库。有一个严重的问题——每个文件的结构都与datatable不同。例如:

数据库: 它有像ImageURL、Title、Content这样的列

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. 在代码后台,将创建并存储导入当前文件的规则。

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

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

这对于每个 CONTENTS 元素都是功能性的吗? - Branislav B.
@Branislav - 是的。@XML.nodes('/contents')会为每个contents节点在结果集中返回一行。Title[1]将给出“当前”contents节点中Title的第一个出现。 - Mikael Eriksson
如果我想使用这样的结构怎么办:<content> <someOtherNode> <imageURL>图片链接</imageURL> ... </someOtherNode> </content> - Branislav B.
@Branislav - 更新了答案,使用了新的结构。 - Mikael Eriksson
不好意思打扰您,我还有一个问题 - 如果我想使用这样的结构: <content> <imageURL><url>第一个URL</url></imageURL> <info> <title>标题</title> <text>文本</title> </info> </content> - Branislav B.
显示剩余3条评论

1

你是手动导入这些文件吗?

你标记了C#,所以我假设你想要写点什么。

我会:

  • 创建一个Windows窗体或WPF应用程序,
    使用opendialog并选择要导入的文件。
    • 对于每个文件,检查特定节点的存在来确定
      我正在读取哪个文件
    • 使用Linq进行查询

将项目输出到对象列表中;

public class ContentItem 
{
    public string ImageUrl [get;set;}
    public string Title {get;set;}
    public string Content {get;set;}
}
  • 遍历您的对象列表并将其插入数据库。

我不完全理解你的解决方案。 - Branislav B.

0

您可以将所有其他格式转换为您的标准XML(例如,您决定标准模式与第一个示例相同),例如使用XSL进行转换。这样,您只需要决定对非标准XML文件使用哪种转换即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接