把文件内容嵌入(或存入)到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

【Win 10应用开发】把文件嵌入到XML文档的更多相关文章

  1. 【Win 10 应用开发】文件读写的三种方案

    本文老周就跟伙伴们探讨一下关于文件读写的方法.总得来说嘛,有三种方案可以用,而且每种方案都各有特色,也说不上哪种较好.反正你得记住老祖宗留给我们的大智慧——事无定法,灵活运用者为上. OK,咱们开始吧 ...

  2. Objective-C ,ios,iphone开发基础:使用GDataXML解析XML文档,(libxml/tree.h not found 错误解决方案)

    使用GDataXML解析XML文档 在IOS平台上进行XML文档的解析有很多种方法,在SDK里面有自带的解析方法,但是大多情况下都倾向于用第三方的库,原因是解析效率更高.使用上更方便 这里主要介绍一下 ...

  3. net9:磁盘目录文件保存到XML文档及其XML文档的读写操作,以及绑定XML到treeview

    原文发布时间为:2008-08-10 -- 来源于本人的百度文章 [由搬家工具导入] directorytoxml类: using System;using System.Data;using Sys ...

  4. 【Win 10 应用开发】在后台播放视频

    从 1607 (14393)版本开始,MediaPlayer 类就可以在前台与后台之间无缝播放,你不必再考虑前台与后之间的通信,所以从 14393 开始,你就不需要再用 BackgroundMedia ...

  5. 【HTML/XML 10】XML文档中的Schema文件

    导读:DTD是对XML文档进行有效性验证的方法之一,事实上,继DTD之后,出现了用来规范和描述XML文档的第二代标准:Schema.Schema是DTD的继承,但是也有其不同的地方,它是真正的以独立的 ...

  6. Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构

    分享两篇Win 10应用开发的XML文档结构:Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构. Win 10 开发中Adapt ...

  7. 【Win 10 应用开发】Toast通知激活应用——前台&后台

    老周最近热衷于讲故事,接下来还是讲故事时间. 有人问我:你上大学的时候,有加入过学生会吗?读大学有没有必要加入学生会? 哎哟,这怎么回答呢,从短期来说,加入学生会有点用,至少可以娱乐一下,运气好的话, ...

  8. 【Win10 应用开发】自适应Toast通知的XML文档结构

    老规矩,在开始之前老周先讲个故事. 话说公元2015年7月20日,VS 2015发布.于是,肯定有人会问老周了,C#6有啥新特性,我学不来啊.学不来的话你应该检讨.老周比较保守地计算一下,学会C# 6 ...

  9. Java开发知识之XML文档使用,解析

    目录 XML文件详解 一丶XML简介 1.文档结构 2.XML中的元素(Element)或者叫做标签(Tab).属性 文本内容. 节点(Node) 3.XML语法规则 二丶XML文档解析 三丶使用XP ...

随机推荐

  1. 对抗假人 —— 前后端结合的 WAF

    前言 之前介绍了一些前后端结合的中间人攻击方案.由于 Web 程序的特殊性,前端脚本的参与能大幅弥补后端的不足,从而达到传统难以实现的效果. 攻防本为一体,既然能用于攻击,类似的思路同样也可用于防御. ...

  2. python之路 - 基础1

    1.安装windows安装双版本Python2,Python3 下载Python2和Python3https://www.python.org/downloads/ 分别安装两个版本 进入Python ...

  3. 利用SQLServer数据库发送邮件

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 这个应用案例很多,一般都是预警,比如异常连接的时候,或者数据库报错的时候.等等,,, 先 ...

  4. SignalR SelfHost实时消息,集成到web中,实现服务器消息推送

    先前用过两次SignalR,但是中途有段时间没弄了,今天重新弄,发现已经忘得差不多了,做个笔记! 首先创建一个控制台项目Nuget添加引用联机搜索:Microsoft.AspNet.SignalR.S ...

  5. Spring中Bean的作用域、生命周期

                                   Bean的作用域.生命周期 Bean的作用域 Spring 3中为Bean定义了5中作用域,分别为singleton(单例).protot ...

  6. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  7. 根据ip判断返回城市名称查询当地天气

    <?phpheader("content-type:text/html;charset=utf-8");date_default_timezone_set("Asi ...

  8. jquery实现下拉框多选

    一.说明 本文是利用EasyUI实现下拉框多选功能,在ComboxTree其原有的基础上对样式进行了改进,样式表已上传demo,代码如下 二.代码 <!DOCTYPE html PUBLIC & ...

  9. NPM如何更新到最新版

    参考文章--npm更新到最新版本的方法 其实我们可以这样,随便新建一个文件夹例如:F:\test.按着"shift"键,右键该文件夹,选择"在此处打开命令窗口(W)&qu ...

  10. swift 可选类型(optional)--- swift 入门

    一.思维导图 二.代码 //这样无形中就会让代码很丑陋 if x != nil && y != nil { print("x或y都不等于空") } print(&q ...