我正在尝试在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。你能帮助我并告诉你如何阅读缺失级别吗?我已经创建了以下组件:
答案 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>