ssis - SSIS - 打开 XML 文件,在 2 个字符串之间查找字符串并留下找到的字符串
问题描述
我有一个包含多条记录的 XML 文件。我有一个实现的过程,该过程获取该文件并将其插入表中。问题是描述列中有一个几乎 20000 个字符长的 xml 记录。我想要做的是有一个可以打开文件的过程,在 和 字符串之间查找长度超过 255 个字符的字符串,并将字符串的左侧设为 255。最后我保存了所做的更改后的文件。
示例:
我在文件中有:
<Row>
<Attributes>
<Column>
<Name>Column1</Name>
<Value>111111</Value>
</Column>
<Column>
<Name>Column2</Name>
<Value>AAAAAA</Value>
</Column>
<Column>
<Name>Column3</Name>
<Value>XXXX</Value>
</Column>
<Column>
<Name>Column4</Name>
<Value>XXXXXX</Value>
</Column>
<Column>
<Name>Column5</Name>
<Value>FGGGGG</Value>
</Column>
<Column>
<Name>Description</Name>
<Value>PING10,10,10,10TESTEREMOTE,PING20,20,20,20TESTEREMOTE,PING30,30,30,30TESTEREMOTEPING10,10,10,10TESTEREMOTE,PING20,20,20,20TESTEREMOTE,PINGPING10,10,10,10TESTEREMOTE,PING20,20,20,20TESTEREMOTE,PING30,30,30,30TESTEREMOTE30,30,30,30TESTEREMOTE</Value>
</Column>
<Column>
<Name>COLUMN6</Name>
<Value>XX</Value>
</Column>
</Attributes>
</Row>
我想:
查找 <Value> 和 < /Value> 之间的大字符串并将字符串保留为 250 个字符。
<行><属性><列><名称>列1</名称><值>111111</值></列><列><名称>列2</名称><值>AAAAAA</值></列><列><名称>列3</名称><值>XXXX</值></列><列><名称>列4</名称><值>XXXXXX</值></列><列><名称>Column5</名称><值>FGGGGG</值></列><列><名称>描述</名称> <值>PING 10,10,10,10 TESTE REMOTE, PING 20,20 ,20,20 测试遥控器, PING 30,30,30,30 测试遥控器 PING 10,10,10,10 测试遥控器, PING 20,20,20,20 测试遥控器, PING PING 10,10,10,10 测试遥控器, 平 20,20,20,20 TESTE REMOTE, PING 30,30,30,30 TESTE REMOTE< /值> < /列><列><名称>COLUMN6< /名称><值>XX</值>< /列>< /属性>< /行 >
谢谢你
解决方案
在处理 XML 时,我总是遵循 C#。所以这是解决方案:
创建脚本组件源:将两个输出列名称/值都设置为字符串长度 50
输入代码:
添加以下命名空间:
using System.Xml.Serialization;
using System.Collections.Generic;
创建一个类对象,让 XML 序列化为
[XmlRoot(ElementName = "Column")]
public class Column
{
[XmlElement(ElementName = "Name")]
public string Name { get; set; }
[XmlElement(ElementName = "Value")]
public string Value { get; set; }
}
[XmlRoot(ElementName = "Attributes")]
public class Attributes
{
[XmlElement(ElementName = "Column")]
public List<Column> Column { get; set; }
}
[XmlRoot(ElementName = "Row")]
public class Row
{
[XmlElement(ElementName = "Attributes")]
public List<Attributes> Attributes { get; set; }
}
在创建新的输出行中添加:
string xml = @"<Row>
<Attributes>
<Column>
<Name>Column1</Name>
<Value>111111</Value>
</Column>
<Column>
<Name>Column2</Name>
<Value>AAAAAA</Value>
</Column>
<Column>
<Name>Column3</Name>
<Value>XXXX</Value>
</Column>
<Column>
<Name>Column4</Name>
<Value>XXXXXX</Value>
</Column>
<Column>
<Name>Column5</Name>
<Value>FGGGGG</Value>
</Column>
<Column>
<Name>Description</Name>
<Value>PING10,10,10,10TESTEREMOTE,PING20,20,20,20TESTEREMOTE,PING30,30,30,30TESTEREMOTEPING10,10,10,10TESTEREMOTE,PING20,20,20,20TESTEREMOTE,PINGPING10,10,10,10TESTEREMOTE,PING20,20,20,20TESTEREMOTE,PING30,30,30,30TESTEREMOTE30,30,30,30TESTEREMOTE</Value>
</Column>
<Column>
<Name>COLUMN6</Name>
<Value>XX</Value>
</Column>
</Attributes>
</Row>";
System.IO.MemoryStream stream = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(xml));
XmlSerializer serializer = new XmlSerializer(typeof(Row));
var x = (Row)serializer.Deserialize(stream);
foreach (var att in x.Attributes)
foreach (var col in att.Column)
{
Output0Buffer.AddRow();
Output0Buffer.name = col.Name;
Output0Buffer.value = col.Value.Substring(0, Math.Min(30, col.Value.Length));
}
笔记:
- 我选择了 30 的长度,您可以将其更改为任何您想要的
- 您可以轻松地将文件加载到内存流中,而不是转换字符串
最终输出(基于 30)
推荐阅读
- mac-catalyst - 如何在 macOS 11 中计算 Mac Catalyst 中的实际窗口大小
- excel - 输入总分钟数时,如何让excel以小时和分钟为单位输出持续时间?
- c# - CheckedChanged 未触发
- react-native - React Native滚动视图在android中不起作用
- angular - 如何将 FirebaseUI 正确配置到我的 Angular 项目中?
- excel - Copy columns from one csv file to another using PowerShell
- python - TypeError:“ValueError”类型的参数在 python 的 qpsolvers 中不可迭代
- heroku - Heroku 上 bot 的奇怪问题
- javascript - Java Scrip For Loop 条件问题
- javascript - 为什么在有条件的 innerHTML 之后我的功能不起作用?