转载

【Win 10应用开发】把文件嵌入到XML文档

把文件内容嵌入(或存入)到XML文档中,相信很多朋友会想到把字节数组转化为Base64字符串,再作为XML文档的节点。不过,有人会说了,转化后的base64字符串中含有像“+”这样的符号,写入到XML文档中会发生解析错误。

不知你是否想起XML文档有一种CData内容节点,它可以忽略对字符的解析处理,使用CData节点,可以存放base64字符串。

要在Win App中实现这种处理也不难。

读写XML文档有多种方法,既可以使用.net core中的类,也可以用Linq to XML,还可以用运行时API中提供的操作类型。你喜欢使用哪一种都无所谓。

下面老周以运行时API为例,演示如何把一个文件的内容嵌入到XML文档中。

真的不复杂,上代码你知道了。

             // 选取文件             FileOpenPicker picker = new FileOpenPicker();             picker.FileTypeFilter.Add("*"); //所有文件             StorageFile file = await picker.PickSingleFileAsync();              if (file == null)             {                 return;             }              // 存放文件名             string fileName = file.Name;             // 文件大小             ulong len = (await file.GetBasicPropertiesAsync()).Size;             // base64 字符串             string b64datastr = null;             // 读取文件内容             using (DataReader reader = new DataReader(await file.OpenReadAsync()))             {                 await reader.LoadAsync((uint)len);                 IBuffer buffer = reader.ReadBuffer(reader.UnconsumedBufferLength);                 // 计算base64字符串                 b64datastr = CryptographicBuffer.EncodeToBase64String(buffer);             }              // 构造XML文档             XmlDocument xml = new XmlDocument();             // 根节点             XmlElement root = xml.CreateElement("fileinfo");             xml.AppendChild(root);             // 存放文件名的节点             XmlElement namenode = xml.CreateElement("name");             namenode.AppendChild(xml.CreateTextNode(fileName));             root.AppendChild(namenode);             // 文件内容节点             XmlElement datanode = xml.CreateElement("content");             datanode.AppendChild(xml.CreateCDataSection(b64datastr));             root.AppendChild(datanode);              // 显示XML内容             tbXML.Text = xml.GetXml();              // 将XML文档保存到“文档”             StorageFolder doclib = KnownFolders.DocumentsLibrary;             StorageFile newFile = await doclib.CreateFileAsync("test.xml", CreationCollisionOption.ReplaceExisting);             await xml.SaveToFileAsync(newFile);              Windows.UI.Popups.MessageDialog d = new Windows.UI.Popups.MessageDialog("保存成功。");             await d.ShowAsync(); 

关键点是这几行代码:

             // 构造XML文档             XmlDocument xml = new XmlDocument();             // 根节点             XmlElement root = xml.CreateElement("fileinfo");             xml.AppendChild(root);             // 存放文件名的节点             XmlElement namenode = xml.CreateElement("name");             namenode.AppendChild(xml.CreateTextNode(fileName));             root.AppendChild(namenode);             // 文件内容节点             XmlElement datanode = xml.CreateElement("content");             datanode.AppendChild(xml.CreateCDataSection(b64datastr));             root.AppendChild(datanode); 

这几行代码的功能是在内存中构建XML文档的结构。

最后看看,文件嵌入到XML后是什么情况。

【Win 10应用开发】把文件嵌入到XML文档

最后说一声,体积太大的文件不宜嵌入到XML中,原因就不用我多解释了。

示例代码下载:http://files.cnblogs.com/files/tcjiaan/putfiletoxmldoc.zip

正文到此结束
Loading...