SSIS包无法完整读取XML文件,缺失Date_of_adding字段求助
嘿,我来帮你捋捋这个SSIS读取XML的问题——我之前也碰到过类似的情况,尤其是处理带属性的XML和批量文件的时候,踩过不少坑。
先搞清楚问题根源:属性不在当前读取的节点层级上
大概率你的XML结构是嵌套的,Date_of_adding是父节点(比如根节点)的属性,而你当前用XML源直接读取的是子节点的明细数据,所以映射时根本看不到这个属性。举个例子,你的XML可能长这样:
<Inventory Date_of_adding="2024-05-20"> <Products> <Product ID="101" Name="Laptop" Price="5999" /> <Product ID="102" Name="Mouse" Price="99" /> </Products> </Inventory>
如果直接读取<Product>节点,父节点<Inventory>的Date_of_adding自然不在当前字段列表里——这时候你说的“分两部分读取再合并”就是正确的思路,具体操作如下:
第一步:拆分读取父节点属性和子节点明细
- 读取父节点属性(获取Date_of_adding):
新建一个XML源组件,设置“数据访问模式”为XML文件来自变量(因为你用For Each Loop,需要动态传递当前文件名)。点击“生成XSD”,确保根节点的Date_of_adding属性被包含到XSD中。这一步会为每个XML文件生成一条记录,只包含文件名和Date_of_adding字段。 - 读取子节点明细:
再新建一个XML源组件,同样用变量传递文件名,这次选择读取子节点(比如<Product>),生成对应的XSD获取明细字段。为了后续合并,记得给这部分数据加一个“文件名”字段(用派生列转换,把@[User::CurrentXMLFile]变量转成字段)。
第二步:合并两部分数据
用合并连接或者查找转换把两组数据关联起来:
- 如果用合并连接:先给父节点属性数据和明细数据分别按“文件名”排序(用排序转换),然后在合并连接里以“文件名”为关联键,把
Date_of_adding字段合并到明细数据中。 - 如果用查找转换:把父节点属性数据作为查找源,关联键选“文件名”,然后把
Date_of_adding作为输出字段添加到明细数据里。
额外要检查的两个关键点
1. 确保XSD正确识别了属性
有时候自动生成的XSD会漏掉属性定义,你可以手动编辑XSD,确认Date_of_adding被定义为属性:
<xs:element name="Inventory"> <xs:complexType> <xs:sequence> <xs:element name="Products" type="ProductsType" /> </xs:sequence> <xs:attribute name="Date_of_adding" type="xs:date" use="required" /> </xs:complexType> </xs:element>
如果自动生成的XSD里没有这行,手动加上后重新加载,就能看到Date_of_adding字段了。
2. 确认For Each Loop的变量配置正确
- 确保你用的是
Foreach File Enumerator,正确指定了目标文件夹和文件筛选器(比如*.xml)。 - 把当前文件的完整路径赋值给一个字符串变量(比如
@[User::CurrentXMLFile]),XML源必须通过这个变量动态获取文件名,不能用固定路径模式。
内容的提问来源于stack exchange,提问作者DKM
相关产品推荐
相关产品推荐

