Azure Data Factory复制活动中为XML源record节点添加子列
解决Azure Data Factory中XML记录节点添加子元素的问题
问题根源
复制数据活动的「附加列」是顶层数据集级别的操作,不管用什么路径语法,都会把新列作为顶层节点的同级元素添加,没法嵌入到<record>这类嵌套节点里,这就是你遇到问题的核心原因。
可行解决方法
方法1:用映射数据流(推荐)
映射数据流可以直接操作XML的嵌套节点,步骤清晰高效:
- 新建映射数据流,添加XML源数据集,在源设置里指定根节点为
<root>,集合节点为<record>,这样数据流会把每个<record>解析成一条独立的数据行 - 添加「派生列」转换,新增
column3列,设置对应的值(可以是固定文本、表达式计算值,或者基于其他列的衍生值) - 添加XML接收器数据集,设置根节点为
<root>,集合节点为<record>,运行数据流后,输出的XML里每个<record>都会包含<column1>、<column2>、<column3>三个子元素
方法2:在XML源数据集里用XSLT转换
直接在源端通过XSLT预处理XML,把<column3>嵌入到每个<record>中:
- 编辑你的XML源数据集,找到「XSLT转换」配置项
- 编写如下XSLT脚本(可根据实际需求修改
column3的值):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <!-- 复制所有原有节点 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 针对record节点添加column3 --> <xsl:template match="record"> <record> <xsl:copy-of select="column1"/> <xsl:copy-of select="column2"/> <!-- 这里可以设置固定值,也可以通过XPath动态取值 --> <column3>自定义值</column3> </record> </xsl:template> </xsl:stylesheet>
- 保存数据集后,在复制数据活动中使用这个源数据集,读取到的XML已经包含每个
<record>下的<column3>
方法3:中转格式转换(备选)
如果必须用复制数据活动,可通过中转格式绕路实现:
- 第一步:将XML源数据复制到JSON/CSV接收器,此时每个
<record>会被转成一行数据,在这一步的「附加列」里添加column3 - 第二步:将JSON/CSV源数据复制回XML接收器,设置根节点为
<root>,集合节点为<record>,最终生成的XML里<column3>会成为<record>的子元素
内容的提问来源于stack exchange,提问作者neizan
相关产品推荐
相关产品推荐

