【问题标题】:XML is not read fully by SSIS packageSSIS 包未完全读取 XML
【发布时间】:2018-05-07 01:54:42
【问题描述】:

我正在尝试读取 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。你能帮我告诉我如何阅读缺失的水平吗?我已经创建了以下组件:

【问题讨论】:

  • “我应该将 XML 读取分成两部分,然后将每个路径的结果合并为一个结果,但我不能这样做”为什么不呢?你有错误吗? XML Source 组件有多个输出,具体取决于您的 XSD 层次结构,请确保链接到您的数据转换的是“表格货币”。
  • 问题是,在 COLUMNS 子选项卡中我无法选择有趣的输出,只有来自位置的元素。为什么我看不到这个 XML 的更多输出?这里有什么问题?
  • 删除将您的 XML 源与数据转换链接的行,然后单击 XML 源将其选中并将新链接拖放到数据转换。应该会弹出一个显示,询问您要链接的 XML 的哪个输出(表货币或头寸)。这些是 XML 的嵌套级别(如 XSD 中所述)。
  • 我已经执行了您的步骤,但没有任何弹出窗口询问我要选择哪个级别。仍然得到相同的结果 - 仅“位置”元素。你能帮忙吗?
  • XSD 文件附在上面。此文件中有列,但它不会在 XML 任务输出级别中显示为单独的级别。这就是问题所在。

标签: xml ssis sql-server-2012


【解决方案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) - 您必须在脚本中或数据流中的下一个任务中处理转换。

【讨论】:

  • 谢谢。我的解决方案如下:我使用 XPATH 从 标记中获取这个值并将其保存到全局变量中。接下来,我使用 SSIS 中可用的 XML 控件阅读了这个 标记,后来将它与“派生列”控件结合起来,并将所有内容放入数据库中。它工作正常。对于每个循环,此变量的每次迭代都会更改并与新读取文件中的新元素连接。它工作正常。
  • 好的。好方法,即使我更喜欢一步解决它而不是两步和派生列。 ;-) 但只要它可以正常工作:-D
【解决方案2】:

嗯,有趣的案例。
基本上,您有一个 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>

【讨论】:

  • 我做了类似的事情,但没有添加根元素,而是稍后在 xml 中添加了一些其他元素。我将这两个节点移到了新节点中,并且在我更新 XSD 文件后它识别出了这一变化。问题是我不能这样做,因为我每次都从 HTTP 源动态下载。这很好,但不能在我的解决方案中完成。现在,在我在评论中完成上述所有操作后,它就可以工作了。感谢这里的信息。
猜你喜欢
  • 2014-07-24
  • 2014-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多