zoukankan      html  css  js  c++  java
  • 【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后是什么情况。

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

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

  • 相关阅读:
    前端vue采用formData数据格式传递文件(Post请求)和非文件参数。后端怎样接收的问题(已解决)
    easyExcel 所需的maven 依赖
    基于客户数据的银行信用卡风险控制模型研究-金融风控模型标准评分卡
    chrome 插件知识点(转载)
    EasyNVR调用指定时间端录像播放接口出现黑屏的问题原因以及解决方法
    EasyNVR智能云终端推送视频流至EasyNVS管理平台失败且报错如何排查?
    EasyNVR分发rtsp不标准导致客户端检查报错是什么原因?
    EasyNVR前端在线修改录像存储路径后hls直播失效问题的处理
    EasyNVR实时阅览四分屏状态下最后一路流无法正常播放问题排查
    通过EasyNVR推流到抖音快手直播间无法正常推流是什么原因?
  • 原文地址:https://www.cnblogs.com/tcjiaan/p/5060451.html
Copyright © 2011-2022 走看看