SSIS包不能完全读取XML

时间:2018-05-07 01:54:42

标签: xml ssis sql-server-2012

我正在尝试在SSIS包中读取XML文件。问题是,当我尝试使用XML SOURCE进程读取XML源文件时,它不会读取此文件的完整内容。在我的场景中,我在文件夹中有一些文件,我使用“For Each Loop”阅读。然后,当我需要映射此文件中可用的列时,我没有看到一个属性:“Date_of_adding”对我来说非常重要。我已经读过,我应该将XML阅读分为两部分,然后将每个路径的结果合并为一个结果,但我不能这样做:https://social.msdn.microsoft.com/Forums/sqlserver/en-US/ca7dabf5-9810-4661-b8cb-94c2fd0fddde/loading-xml-file-with-header-and-detail-information-to-sql-sever-table?forum=sqlintegrationservices。你能帮助我并告诉你如何阅读缺失级别吗?我已经创建了以下组件:

1 2 3 4 5 6 7

2 个答案:

答案 0 :(得分:1)

我建议将C#脚本组件定义为源 - 这提供了根据需要处理XML的可能性,而无需使用XSD。无论如何,如果涉及更复杂的XML脚本,额外的XSLT将是有用的。 但是,按照示例C#控制台应用程序代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication22
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Start...");

            string sPath = "C:\\temp\\xs\\a.xml";

            XDocument xdoc = XDocument.Load(sPath);

            string snumer_tabeli = xdoc.Element("tabela_kursow").Element("numer_tabeli").Value.ToString();
            string sdata_publikacji = xdoc.Element("tabela_kursow").Element("data_publikacji").Value.ToString();

            IEnumerable<XElement> elements = xdoc.Element("tabela_kursow").Elements("pozycja");
            foreach (XElement element in elements)
            {
                // Start of SSIS Buffer Column adding...
                Console.WriteLine("numer_tabeli ---> " + snumer_tabeli);
                Console.WriteLine("data_publikacji ---> " + sdata_publikacji);
                foreach (XElement xelement in element.Descendants())
                {
                    Console.WriteLine(xelement.Name + " ---> " + xelement.Value.ToString());
                }
                // End of SSIS Buffer Column adding...
                Console.WriteLine("\n");
            }

            Console.WriteLine("...End");
            Console.ReadKey();
        }
    }
}

这是一个示例SSIS脚本组件。

public override void CreateNewOutputRows()
{
    XDocument xdoc = XDocument.Load(sPath);

    string snumer_tabeli = xdoc.Element("tabela_kursow").Element("numer_tabeli").Value.ToString();
    string sdata_publikacji = xdoc.Element("tabela_kursow").Element("data_publikacji").Value.ToString();

    IEnumerable<XElement> elements = xdoc.Element("tabela_kursow").Elements("pozycja");
    foreach (XElement element in elements)
    {
        Output0Buffer.AddRow();
        Output0Buffer.numertabeli = snumer_tabeli;
        Output0Buffer.datapublikacji = sdata_publikacji;
        foreach (XElement xelement in element.Descendants())
        {
            switch (xelement.Name.ToString())
            {
                case "nazwa_waluty":
                    Output0Buffer.nazwawaluty = xelement.Value.ToString();
                    break;

                case "przelicznik":
                    Output0Buffer.przelicznik = xelement.Value.ToString();
                    break;

                case "kod_waluty":
                    Output0Buffer.kodwaluty = xelement.Value.ToString();
                    break;

                case "kurs_sredni":
                    Output0Buffer.kurssredni = xelement.Value.ToString();
                    break;

                default:
                    break;
            }
        }
    }
}

sPath是我定义的变量,它是从SSIS包变量加载的。要使用此组件,必须将对System.XML.Linq的引用添加到脚本组件。目前,我将所有输出列定义为String(dt_wstr(50) - 您必须在脚本内或数据流的下一个任务中处理转换。

答案 1 :(得分:1)

嗯,有趣的案例 基本上,您有一个table currency根元素,但无法读取其属性 - date of adding SSIS XML Source 从XML结构派生输出集,顶级条目不映射到任何输出;这是设计的。 MSDN给出了对这种现象的一些解释 我在类似情况下使用的解决方案 - 在table currency节点之前添加另一个根节点,因此您的XML看起来像

<?xml version="1.0" ?>
<root_node>
 <table_currency ...>
 ...
 </table_currency>
</root_node>

您可以使用 XML任务使用XSLT转换执行此操作

<xsl:template match="/">
 <root_node>
  <xsl:copy-of select="node()"/>
 </root_node>
</xsl:template>