XML在数据交换中的作用越来越大。在公文无纸化传输中,传输的不仅有文本,还有签名、word文件、其他附件等等,如何将这些二进制文件嵌入XML中进行传输,这里以嵌入一个签名图片为例,做简单介绍。 转
1.将二进制文件以Base64格式写入XML
public void InsertFileToXml()
{
FileStream fs = File.OpenRead( "d:\\sign.gif");
byte [] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
XmlTextWriter writer = new XmlTextWriter( "d:\\user.xml",System.Text.Encoding.Default);
writer.Formatting = Formatting.Indented;
writer.WriteStartDocument();
writer.WriteStartElement( "User");
writer.WriteElementString( " First_Name " , "John");
writer.WriteElementString( " Last_Name " , "Wang");
writer.WriteStartElement( "Signature");
writer.WriteAttributeString( " filename " , "sign.gif");
writer.WriteBase64(buffer,0,buffer.Length);
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteEndDocument();
writer.Flush();
writer.Close();
}
{
FileStream fs = File.OpenRead( "d:\\sign.gif");
byte [] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
XmlTextWriter writer = new XmlTextWriter( "d:\\user.xml",System.Text.Encoding.Default);
writer.Formatting = Formatting.Indented;
writer.WriteStartDocument();
writer.WriteStartElement( "User");
writer.WriteElementString( " First_Name " , "John");
writer.WriteElementString( " Last_Name " , "Wang");
writer.WriteStartElement( "Signature");
writer.WriteAttributeString( " filename " , "sign.gif");
writer.WriteBase64(buffer,0,buffer.Length);
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteEndDocument();
writer.Flush();
writer.Close();
}
生成后的XML(user.xml)内容如下:
<?xml version="1.0" encoding="gb2312"?>
<User>
< First_Name > John </First_Name>
< Last_Name > Wang </Last_Name>
< Signature filename ="sign.gif" > R0lGODlhZAAZAIAAAJ0IDf///yH5BAAAAAAALAAAAABkABkAAAKXjI+py+0Po5y02ouz3rz7D4biSJbmiabqAbQr2sbANL+Ja9WNzDv6qvvlJMKdLVD74WjESJH1HLKQhuSSEoU2FzHGEqdEBmfW5CV7FaepXe3za4YKs1Tp7a2V16t8hZV9h5WhhJZXFSfWdzfGQffQ49OGEDSleOIIQ+mngnk5eWQIKsrVOcpJZpqqWKpKotkq+gp7JKtQAAA7 </Signature>
</ User >
<User>
< First_Name > John </First_Name>
< Last_Name > Wang </Last_Name>
< Signature filename ="sign.gif" > R0lGODlhZAAZAIAAAJ0IDf///yH5BAAAAAAALAAAAABkABkAAAKXjI+py+0Po5y02ouz3rz7D4biSJbmiabqAbQr2sbANL+Ja9WNzDv6qvvlJMKdLVD74WjESJH1HLKQhuSSEoU2FzHGEqdEBmfW5CV7FaepXe3za4YKs1Tp7a2V16t8hZV9h5WhhJZXFSfWdzfGQffQ49OGEDSleOIIQ+mngnk5eWQIKsrVOcpJZpqqWKpKotkq+gp7JKtQAAA7 </Signature>
</ User >
2.从XML中读取文件
XmlTextReader reader
=
new
XmlTextReader(
@"
d:\user.xml");
while (reader.Read())
{
if (reader.Name == " Signature " && reader.NodeType == XmlNodeType.Element)
{
byte [] buffer = new byte [1024];
int size;
FileStream file = File.Create( " d:\\ " + reader.GetAttribute( " filename"));
while (true)
{
size = reader.ReadBase64(buffer, 0 ,1024);
if (size >0)
{
file.Write(buffer,0,size);
}
else
{
break;
}
}
file.Close();
}
}
while (reader.Read())
{
if (reader.Name == " Signature " && reader.NodeType == XmlNodeType.Element)
{
byte [] buffer = new byte [1024];
int size;
FileStream file = File.Create( " d:\\ " + reader.GetAttribute( " filename"));
while (true)
{
size = reader.ReadBase64(buffer, 0 ,1024);
if (size >0)
{
file.Write(buffer,0,size);
}
else
{
break;
}
}
file.Close();
}
}