【问题标题】:import XML to SQL Server database将 XML 导入 SQL Server 数据库
【发布时间】:2011-09-06 05:05:35
【问题描述】:

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

数据库: 它有如下列: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. 在后面的代码中,将创建导入当前文件的规则并将其存储到数据库中。

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

【问题讨论】:

    标签: c# asp.net sql-server xml import


    【解决方案1】:

    您需要弄清楚您拥有的不同版本并编写一些代码来处理每个 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
    

    【讨论】:

    • 问题:在第一个示例中,您为什么选择 'Title[1]' 而不是 'Title' ?
    • @Branislav – value 只能从 1 个元素返回值。 我们知道只有一个,但解析器不知道,所以[1] 告诉value 函数选择Title 的第一个匹配项。
    • 这对每个 CONTENTS 元素都有效吗?
    • @Branislav – 是的。 @XML.nodes('/contents') 将为每个 contents 节点在结果集中为您提供一行。 Title[1] 将在“当前”contents 节点中为您提供第一次出现的 Title。
    • 如果我想使用这样的结构怎么办: link to image ...
    【解决方案2】:

    您可以将所有其他格式转换(例如使用 xsl)到您的标准 xml(例如,您决定标准架构类似于 1 示例)。像这样,您只需要决定对非标准 xml 文件使用哪种转换。

    【讨论】:

      【解决方案3】:

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

      你已经标记了这个 c#,所以我假设你想写点什么。

      我愿意;

      • 创建 Windows 窗体或 WPF 应用程序,
        使用 opendialog 并选择文件/s 你想导入。
        • 对于每个文件,检查某些节点的存在以确定哪个
          我正在阅读的文件
        • 使用 Linq 查询

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

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

      【讨论】:

      • 我不完全理解你的解决方案
      猜你喜欢
      • 2010-10-17
      • 1970-01-01
      • 2013-09-08
      • 2014-05-18
      • 2018-04-17
      • 2010-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多