如何从C#项目XML资源中还原Base64编码的GIF文件
问题描述
现有一个作为C#项目资源的happy_face.xml,格式如下:
<?xml version="1.0" encoding="UTF-8"?> <root> <file name="happy_face.gif"> R0lGODlhEAAQAPcAAAAAAIAAAACAAICAAAAAgIAAgACAgICAgMDAwP8AAAD/AP//AAAA//8A/wD//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz/wBmAABmMwBmZgBmmQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wDMAADMMwDMZgDMmQDMzADM/wD/AAD/MwD/ZgD/mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMzADMzMzMzZjMzmTMzzDMz/zNmADNmMzNmZjNmmTNmzDNm/zOZADOZMzOZZjOZmTOZzDOZ/zPMADPMMzPMZjPMmTPMzDPM/zP/ADP/MzP/ZjP/mTP/zDP//2YAAGYAM2YAZmYAmWYAzGYA/2YzAGYzM2YzZmYzmWYzzGYz/2ZmAGZmM2ZmZmZmmWZmzGZm/2aZAGaZM2aZZmaZmWaZzGaZ/2bMAGbMM2bMZmbMmWbMzGbM/2b/AGb/M2b/Zmb/mWb/zGb//5kAAJkAM5kAZpkAmZkAzJkA/5kzAJkzM5kzZpkzmZkzzJkz/5lmAJlmM5lmZplmmZlmzJlm/5mZAJmZM5mZZpmZmZmZzJmZ/5nMAJnMM5nMZpnMmZnMzJnM/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwAM8wAZswAmcwAzMwA/8wzAMwzM8wzZswzmcwzzMwz/8xmAMxmM8xmZsxmmcxmzMxm/8yZAMyZM8yZZsyZmcyZzMyZ/8zMAMzMM8zMZszMmczMzMzM/8z/AMz/M8z/Zsz/mcz/zMz///8AAP8AM/8AZv8Amf8AzP8A//8zAP8zM/8zZv8zmf8zzP8z//9mAP9mM/9mZv9mmf9mzP9m//+ZAP+ZM/+ZZv+Zmf+ZzP+Z///MAP/MM//MZv/Mmf/MzP/M////AP//M///Zv//mf//zP///yH5BAEAABAALAAAAAAQABAAAAhTAP8JFIiioMGBCAnqW8gQRUKFDCM6RIhiYUWLDQderMhR30WP/z527NjwY8STFk2ilLjRoEuRMF+yZGnwpMOYKieGLGlSJ0SPEh/utCmU4MuEAQEAOw== </file> </root>
该XML存储了16x16的GIF图像的Base64编码数据,文件名由file节点的name属性指定。需要实现代码从程序集读取该XML资源,将Base64解码后的内容保存为同名GIF文件到程序EXE所在目录。以下是两段未完成的代码,请求完善:
未完成的尝试1
namespace WpfApp1 { static class MyXMLTools { // Read XML from EXE assembly and // Save XML stored binary file to the local disk public static void XmlExtract( string NAME = "WpfApp1.happy_face.xml") { Assembly assembly = Assembly.GetExecutingAssembly(); using(Stream stream = assembly.GetManifestResourceStream(NAME)) { using (StreamReader reader = new StreamReader(stream)) { /// ???? /// ??? } } } } // class } // namespace
未完成的尝试2
namespace WpfApp1 { static class MyXMLTools { // Read XML from EXE assembly and // Save XML stored binary file to the local disk public static void XmlExtract( string NAME = "WpfApp1.happy_face.xml") { Assembly assembly = Assembly.GetExecutingAssembly(); Stream stream = assembly.GetManifestResourceStream(NAME); XmlDocument mapfile = new XmlDocument(); mapfile.Load(stream); stream.Close(); // ??? ??? } } }
完善后的代码
版本1:基于StreamReader读取XML内容后解析
using System; using System.IO; using System.Reflection; using System.Xml; namespace WpfApp1 { static class MyXMLTools { // 从程序集读取XML资源,解码并保存内嵌的GIF文件 public static void XmlExtract(string NAME = "WpfApp1.happy_face.xml") { Assembly assembly = Assembly.GetExecutingAssembly(); using(Stream stream = assembly.GetManifestResourceStream(NAME)) { using (StreamReader reader = new StreamReader(stream)) { // 读取完整XML文本 string xmlContent = reader.ReadToEnd(); XmlDocument doc = new XmlDocument(); doc.LoadXml(xmlContent); // 定位到file节点 XmlNode fileNode = doc.SelectSingleNode("//file"); if (fileNode == null) return; // 获取目标文件名 string fileName = fileNode.Attributes["name"]?.Value; if (string.IsNullOrEmpty(fileName)) return; // 提取并解码Base64数据 string base64Data = fileNode.InnerText.Trim(); byte[] imageBytes = Convert.FromBase64String(base64Data); // 拼接保存路径(EXE所在目录) string savePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, fileName); File.WriteAllBytes(savePath, imageBytes); } } } } }
版本2:直接用XmlDocument加载流
using System; using System.IO; using System.Reflection; using System.Xml; namespace WpfApp1 { static class MyXMLTools { // 从程序集读取XML资源,解码并保存内嵌的GIF文件 public static void XmlExtract(string NAME = "WpfApp1.happy_face.xml") { Assembly assembly = Assembly.GetExecutingAssembly(); using (Stream stream = assembly.GetManifestResourceStream(NAME)) { if (stream == null) return; XmlDocument mapfile = new XmlDocument(); mapfile.Load(stream); // 定位到file节点 XmlNode fileNode = mapfile.SelectSingleNode("//file"); if (fileNode == null) return; // 获取目标文件名 string fileName = fileNode.Attributes["name"]?.Value; if (string.IsNullOrEmpty(fileName)) return; // 提取并解码Base64数据 string base64Data = fileNode.InnerText.Trim(); byte[] imageBytes = Convert.FromBase64String(base64Data); // 拼接保存路径(EXE所在目录) string savePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, fileName); File.WriteAllBytes(savePath, imageBytes); } } } }
关键注意点
- 必须将项目中的
happy_face.xml的生成操作设置为嵌入的资源,否则GetManifestResourceStream无法找到资源。 - 代码添加了空值检查,避免XML结构异常导致运行报错。
- 解码后的GIF文件会保存到当前程序的运行目录(即EXE所在文件夹)。
内容的提问来源于stack exchange,提问作者Bimo
相关产品推荐
相关产品推荐

