首页 > 解决方案 > 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</值>< /列>< /属性>< /行 >

谢谢你

标签: ssisscript-task

解决方案


在处理 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));
        }

笔记:

  1. 我选择了 30 的长度,您可以将其更改为任何您想要的
  2. 您可以轻松地将文件加载到内存流中,而不是转换字符串

最终输出(基于 30)

在此处输入图像描述


推荐阅读