BI备忘录

BI,SSIS,SSAS,SSRS
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

SSIS中处理XML

Posted on 2010-04-16 09:40  安德鲁  阅读(540)  评论(1)    收藏  举报

可用Foreach NodeList Enumerator,

 

代码
1 <Parameters     >
2 <Parameter>
3 <Name>Date</Name>
4 <Value >[Date].[Year-Month].[Year].&amp;[2010]</Value>
5 </Parameter>
6 <Parameter>
7 <Name>Bank</Name>
8 <Value >{ [Bank].[Bank].&amp;[69],[Bank].[Bank].&amp;[70] }</Value>
9 </Parameter>
10 </Parameters>

EnumerationType:ElementCollection

OuterXPath: /Parameters/Parameter

InnerXPath:*

映射:User::paramName,索引0,第一次外循环,取得字符串"Date"

        User::paramValue,索引为1,第一次外循环取得字符串"[Date].[Year-Month].[Year].&amp;[2010]

 

但是,如果XML中包含命名空间,如下所示,上面的设置不会获取任何节点。

 

代码
1 <Parameters xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:schemas-microsoft-com:xml-analysis">
2 <Parameter>
3 <Name>Date</Name>
4 <Value xsi:type="xsd:string">[Date].[Year-Month].[Year].&amp;[2010]</Value>
5 </Parameter>
6 <Parameter>
7 <Name>Bank</Name>
8 <Value xsi:type="xsd:string">{ [Bank].[Bank].&amp;[69],[Bank].[Bank].&amp;[70] }</Value>
9 </Parameter>
10 </Parameters>

Foreach NodeList中还没找到相关设置,这里直接用SSIS中脚本任务来处理,示例代码如下:

 

 

代码
public void Main()
{
// TODO: Add your code here
String mdxQuery = Dts.Variables["textData"].Value.ToString();

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(Dts.Variables["parameters"].Value.ToString());
XmlNamespaceManager xnsm=new XmlNamespaceManager(xmlDoc.NameTable);
xnsm.AddNamespace("param", "urn:schemas-microsoft-com:xml-analysis");
XmlNodeList nodeList = xmlDoc.SelectNodes("/param:Parameters/param:Parameter",xnsm);
Dts.Variables["nodeList"].Value = nodeList;
foreach (XmlNode xmlNode in nodeList) {
String paramName=xmlNode.ChildNodes[0].LastChild.Value.ToString();
paramName = "@[" + paramName + "]";
String paramValue = xmlNode.ChildNodes[1].LastChild.Value.ToString();
paramValue = "\"" + paramValue + "\"";
mdxQuery=mdxQuery.Replace(paramName,paramValue);
}
Dts.Variables["mdxQuery"].Value = mdxQuery;
Dts.TaskResult = (int)ScriptResults.Success;
}

 

参考

Select Nodes Using XPath Navigation(http://msdn.microsoft.com/en-us/library/d271ytdx.aspx)