C# WinForms 实现文件转 XML 互转示例
本文将演示如何使用C#编写一个Windows Forms程序,利用Base64编码技术将Office二进制文件转换为XML数据进行传输或存储,并能将其重新还原为原始Office文件。
应用场景
在多层架构开发中,有时需要通过Web服务、RPC或其他基于文本的协议传输二进制文件。XML因其平台无关性和良好的可读性成为常用载体。通过将文件内容进行Base64编码并嵌入XML结构,可以解决跨平台、跨语言的数据交互问题。
功能概述
本示例包含四个主要操作:
- 加载Office文件:读取本地文件并序列化为XML结构。
- 保存为XML:将内存中的XML对象保存至磁盘。
- 加载XML文件:读取之前保存的XML数据到内存。
- 还原Office文件:解析XML中的Base64数据并写回二进制文件。
关键步骤与逻辑
第1步:准备界面控件
创建一个标准的WinForms窗体,添加以下控件以支持文件选择和数据持久化:
Button:命名为button3(加载Office)、button1(生成XML)、button4(加载XML)、button2(生成Doc)。OpenFileDialog:openFileDialog1,用于选择源文件。SaveFileDialog:saveFileDialog1,用于指定输出路径。XmlDocument:实例化两个私有字段mXmlDoc(用于存放当前加载/生成的XML数据) 和doc(用于存放待还原的XML数据)。
第2步:将Office文件转换为XML (编码)
此步骤旨在读取二进制文件,将其转换为Base64字符串,并封装进XML标签中。
第3步:执行具体动作
// 在 button3_Click 事件处理程序中
private void button3_Click(object sender, System.EventArgs e)
{
// 1. 设置文件过滤器:仅允许选择 .doc, .xls, .ppt 文件
openFileDialog1.Filter = "Office Documents(*.doc, *.xls, *.ppt)|*.doc;*.xls;*.ppt";
openFileDialog1.ShowDialog();
string strFileName = openFileDialog1.FileName;
if (strFileName.Length != 0)
{
// 2. 以只读模式打开文件流
using (FileStream inFile = new FileStream(strFileName, System.IO.FileMode.Open, System.IO.FileAccess.Read))
{
// 3. 读取所有字节
byte[] binaryData = new byte[inFile.Length];
inFile.Read(binaryData, 0, (int)inFile.Length);
// 4. 转换为 Base64 字符串
string base64String = Convert.ToBase64String(binaryData);
// 5. 构建 XML 字符串模板
// 此处将文件内容存储在 节点的 aa 属性中
string xmlTemplate = string.Format("<wawa><me aa=\"{0}\" /></wawa>", base64String);
// 6. 加载 XmlDocument 对象
mXmlDoc = new System.Xml.XmlDocument();
mXmlDoc.LoadXml(xmlTemplate);
MessageBox.Show("加载成功");
}
}
}
第4步:将XML保存为文件
调用 mXmlDoc.Save() 方法将内存中的XML结构持久化。
// 在 button1_Click 事件处理程序中
private void button1_Click(object sender, System.EventArgs e)
{
saveFileDialog1.Filter = "xml 文件|*.xml";
saveFileDialog1.Title = "保存成 xml 文件";
saveFileDialog1.ShowDialog();
if (saveFileDialog1.FileName != "")
{
// 保存 XML 文档
mXmlDoc.Save(saveFileDialog1.FileName);
MessageBox.Show("保存成功");
}
}
第5步:加载已保存的XML文件
读取之前的XML文件,将其加载到 doc 对象中,以便后续进行还原操作。
// 在 button4_Click 事件处理程序中
private void button4_Click(object sender, System.EventArgs e)
{
openFileDialog1.Filter = "xml 文件|*.xml";
openFileDialog1.ShowDialog();
string strFileName = openFileDialog1.FileName;
if (strFileName.Length != 0)
{
doc = new XmlDocument();
doc.Load(strFileName);
MessageBox.Show("加载成功");
}
}
第6步:将XML还原为Office文件 (解码)
从XML中提取Base64字符串,解码为字节数组,并写入新的二进制文件。
// 在 button2_Click 事件处理程序中
private void button2_Click(object sender, System.EventArgs e)
{
// 1. 获取 XML 根元素下的 'me' 节点
XmlNode node = doc.DocumentElement.SelectSingleNode("me");
XmlElement ele = (XmlElement)node;
// 2. 获取 Base64 字符串属性 'aa'
string pic = ele.GetAttribute("aa");
// 3. 将 Base64 字符串解码为字节数组
byte[] bytes = Convert.FromBase64String(pic);
// 4. 选择保存路径
saveFileDialog1.Filter = "Office Documents(*.doc, *.xls, *.ppt)|*.doc;*.xls;*.ppt";
saveFileDialog1.Title = "保存成 office 文件";
saveFileDialog1.ShowDialog();
if (saveFileDialog1.FileName != "")
{
// 5. 创建文件流并写入数据
using (FileStream outfile = new FileStream(saveFileDialog1.FileName, System.IO.FileMode.CreateNew))
{
outfile.Write(bytes, 0, bytes.Length);
}
MessageBox.Show("保存成功");
}
}
注意事项
- 资源释放:在实际生产环境中,建议使用
using语句包裹FileStream以确保流被正确关闭。示例代码中手动管理了部分资源,但在大型应用中应规范化处理。 - 大文件处理:如果处理的文件较大,将整个文件读取到内存并转换为Base64可能会导致内存溢出。对于大文件,建议考虑使用分块传输或专门的流式XML序列化方案。
- 安全性:从不可信来源加载XML时,请注意防止XXE(XML External Entity)攻击。虽然示例使用的是简单的LoadXml/String格式化,但在实际应用中需验证输入源。
总结
通过上述C# WinForms示例,我们实现了基于Base64编码的文件与XML互转功能。这种方法结构简单,易于理解,适用于小型文件或作为理解文件序列化基础概念的入门案例。以上就是C# WinForms实现文件与XML互转转换的详细过程,更多关于C#文件操作与XML处理的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













