SSIS C# 脚本任务:如何 match/replace 在大型 XML 文件上增加增量模式

SSIS C# Script Task: How to match/replace pattern with increment on a large XML file

还有其他类似的问题已被提出并得到回答,但是 none 这些答案适用于我正在尝试做的事情,或者没有足够的信息让我知道如何实施它在我自己的代码中。弄了两天了,现在必须寻求帮助。

我在 SSIS 包中有一个脚本任务,我需要在其中匹配并替换包含数千个记录标识符标记的大型 XML 文件。每一个都包含一个数字。我需要这些数字是连续的并且递增 1。例如,在 xml 文件中,我可以找到如下所示的标签:

<ns1:recordIdentifier>1</ns1:recordIdentifier>
<ns1:recordIdentifier>6</ns1:recordIdentifier>
<ns1:recordIdentifier>223</ns1:recordIdentifier>
<ns1:recordIdentifier>4102</ns1:recordIdentifier> 

我需要用连续的增量查找和替换这些标签,如下所示:

<ns1:recordIdentifier>1</ns1:recordIdentifier>
<ns1:recordIdentifier>2</ns1:recordIdentifier>
<ns1:recordIdentifier>3</ns1:recordIdentifier>
<ns1:recordIdentifier>4</ns1:recordIdentifier> 

我目前的代码导致所有数字都为“1”且没有递增。

我尝试了几十种不同的方法,但都没有奏效。

关于如何修改下面的代码以根据需要增加的任何想法?

public void Main()
{            
string varStart = "<ns1:recordIdentifier>";
string varEnd = "</ns1:recordIdentifier>";
int i = 1;
string path = Dts.Variables["User::xmlFilename"].Value.ToString();
string outPath = Dts.Variables["User::xmlOutputFile"].Value.ToString();
string ptrn = @"<ns1:recordIdentifier>\d{1,4}<\/ns1:recordIdentifier>";
string replace = varStart + i + varEnd;

using (StreamReader sr = File.OpenText(path))
{
 string s = "";
 while ((s = sr.ReadLine()) != null && i>0)
{
 File.WriteAllText(outPath, Regex.Replace(File.ReadAllText(path),
 ptrn, replace));
 i++;
}

}

}

您使用 Replace 方法的方法是正确的,但是在递增时需要使用 MatchEvaluater 参数。

string inputFile = Dts.Variables["User::xmlFilename"].Value.ToString();
string outPutfile = Dts.Variables["User::xmlOutputFile"].Value.ToString();
string fileText = File.ReadAllText(inputFile);

//get any number between elements
Regex reg = new Regex("<ns1:recordIdentifier>[0-9]</ns1:recordIdentifier>");

string xmlStartTag = "<ns1:recordIdentifier>";
string xmlEndTag = "</ns1:recordIdentifier>";

//assuming this starts at 1
int incrementInt = 1;

fileText = reg.Replace(fileText, tag =>
                   { return xmlStartTag + incrementInt++.ToString() + xmlEndTag; });

File.WriteAllText(outPutfile, fileText);