C# WinForms 实现文件转 XML 互转示例

沈亦白
沈亦白
发布时间:2026-10-13| 3人浏览过
原创

本文将演示如何使用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("保存成功");
    }
}

注意事项

  1. 资源释放:在实际生产环境中,建议使用 using 语句包裹 FileStream 以确保流被正确关闭。示例代码中手动管理了部分资源,但在大型应用中应规范化处理。
  2. 大文件处理:如果处理的文件较大,将整个文件读取到内存并转换为Base64可能会导致内存溢出。对于大文件,建议考虑使用分块传输或专门的流式XML序列化方案。
  3. 安全性:从不可信来源加载XML时,请注意防止XXE(XML External Entity)攻击。虽然示例使用的是简单的LoadXml/String格式化,但在实际应用中需验证输入源。

总结

通过上述C# WinForms示例,我们实现了基于Base64编码的文件与XML互转功能。这种方法结构简单,易于理解,适用于小型文件或作为理解文件序列化基础概念的入门案例。以上就是C# WinForms实现文件与XML互转转换的详细过程,更多关于C#文件操作与XML处理的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。