C# 使用SSIS从XML中提取base64编码的图像

C# 使用SSIS从XML中提取base64编码的图像,c#,xml,ssis,xsd,C#,Xml,Ssis,Xsd,我有一个复杂的场景,客户发送XML文件,我应该从这些文件中提取一些信息。一个重要的信息是在base64中编码的图像 xml的xsd文件定义了包含base64编码图像的元素,如下所示: <xs:element name="image" type="xs:base64Binary" nillable="false" minOccurs="0" maxOccurs="unbounded"&g

我有一个复杂的场景,客户发送
XML
文件,我应该从这些文件中提取一些信息。一个重要的信息是在
base64
中编码的图像

xml
xsd
文件定义了包含base64编码图像的元素,如下所示:

   <xs:element name="image" type="xs:base64Binary" nillable="false" minOccurs="0" maxOccurs="unbounded">
      <xs:annotation>
        <xs:documentation xml:lang="en">
          base64 image.
        </xs:documentation>
      </xs:annotation>
    </xs:element> 
该脚本一直执行到调用
FromStream
方法,并失败,出现以下错误:

参数无效

Q2:考虑到上述场景和配置,如何修复代码错误并成功保存映像?

A1。

根据定义,编码二进制是ASCII字符串数据,因此数据的初始提取将是DT_STRmaybe

在这一点上,您可以直观地检查XML中的字符以确认是的,我正确地从XML中提取了该字段

下一步是将base64编码反转或转换为原始二进制位

A2.Image.FromStream错误

我不确定
Image
类的来源,但它可能试图将数据转换为不同的图像格式(png到jpg到bmp等),但内存中的位已经是您需要的位了。您只需要将字节数组写入磁盘,类似于

可能 联机丛书上的数据类型链接指出了数据类型的最大长度,我们看到DT_STR是8000个字符,而DT_IMAGE/DT_BYTES/DT_TEXT是2.1M个单位(字符或字节)。因为这些数据都不是unicode数据,所以存储成本是相同的,但是没有一种表达式语言可以对数据进行操作(null和长度检查IIRC除外),data viewer将被集中在其中,因此目视检查可能具有挑战性

jpg是一种压缩文件格式——它们丢弃数据以减少字节数。但是Base64是反压缩的,因为它将危险的二进制字符映射为安全的ascii字符,从而增大了大小。所以,除非你知道你的源图像非常小,否则你很可能会溢出8000个字符的边界

假设通货膨胀率为1.3,您将看到大致5970字节的最大原始大小。6kb的jpg文件可能很小,而且质量很低。例如,此图像为5151字节

最后的想法
由于我已经输入了这些内容并考虑了问题域,除非您有充分的理由使用数据流,否则在本例中我将避免使用它。相反,使用脚本任务分解XML。如果您不必担心将数据类型拟合到SSIS基元类型中,也不必担心您的所有操作都将是.NET脚本操作,那么我想问题会少一些。

我的问题没有得到解决,但我最终采用了您建议的方法,通过一个脚本任务处理
XML
,该任务有效:)
byte[] imageBytes = Base64DecodeString(bmpAsString);
fstrm = new FileStream(@"C:\winnt_copy.bmp", FileMode.CreateNew, FileAccess.Write);
BinaryWriter writer = new BinaryWriter(fstrm);
writer.Write(imageBytes);
writer.Close( );
fstrm.Close( );