从写组件说Xml——实现(五)
1.实现接口
前面一篇已经确定了接口,并且已经生成了类,但是这些类显然还不完整,因为这些类没有实现任何接口。
不过,在实现接口之前,必须要注意的是ms的这一段警告:
这里清楚地说明了直接修改这段代码的一个风险:如果xsd发生变化了,那么再次用xsd.exe生成代码时,所做的修改讲丢失。这时要么手工迁移,要么就再写一遍,无论哪种,都是无法接受的。
因此,实现接口的代码不能放在生成的pptx.cnblogs.cs中。这里借助c# 2.0就提供的partial关键字,把对类型的修改放到另一个文件中(这里要注意namespace,如果不相同,就会被认为是两个不同的类型)。所以,新添加的文件至少应该是这样的:
然后实现接口:
2.具体实现…
限于篇幅,以及和主题的相关度,此处省略具体实现。
3.修改pptx
pptx的open xml format说白了就是xml+zip的格式,所以修改xml就可以修改呈现给终端用户的pptx。
现在又要感谢ms的Linq to Xml,可以把原来操作非常麻烦的Xml DOM方式完全扔到一边,用简洁的Linq语法完成当初几十行DOM代码才能完成的辛苦工作。
这里以修改pptx中的文本内容为例(因为这个最简单,其它的都会比较复杂,例如chart需要同时修改缓存数据和真实数据,真实数据又在一个embed xlsx里面,对于不熟悉open xml format的人来说,有点少儿不宜的感觉)。
先来看看文本内容在pptx中的xml到底是什么样子的,为了看xml,先做一个pptx的模板,如下:
保存为sample.pptx,然后到目录下面,把文件名修改成sample.pptx.zip,并解压,找到这个目录:
用vs2008打开slide1.xml,可以看到:
几乎所有内容都在第二行,估计没有人愿意看这样的xml。。。别急,利用vs2008的格式化文档的功能(快捷键为Ctrl+K,Ctrl+D):
瞬间,就可以获得一个完全格式化好的xml,然后再找到里面的placeholder:
可以看到placeholder在a:t节中出现,至于其它的节,暂时忽略它们。
注意先看namespace:a,a的定义为:
所以,需要在代码里面预先定义namespace:
乍一看这个语句是不是有点怪,左边的类型是XNamespace,而右边怎么是个字符串?别急,来看看XNamespace的定义:
可以发现XNamespace里面定义了从string的隐式转换,所以上面那个语句是合法的,另外,还有一个很重要的运算符重载+,输入是XNamespace和string,输出为XName,这个运算符重载将在后面非常广泛的用到。
下面来看看TextModification的大体结构吧:
这里用到了ExecutionContext的两个扩展方法,GetCurrentSlideDocument和SaveCurrentSlideDocument这两个方法,分别用于取得XDocument的实例和保存这个实例,而中间的todo就是实现的重点。
还记得前面的a:t吗?需要到整个xml文档中去查找a:t的节点,怎么找哪?最简单的当然是用Linq to Xml:
Descendants方法代表着XPath的子孙轴(关于Xml的13个轴可以参考w3schools,为了方便起见,就来个截图:
),也就是查找Xml文档下面的所有节点。
但是前面的Linq找到的是所有的a:t,而不是包含特定内容的a:t,所以需亚修改一下Linq:
节点找到了,但是还需要修改它们:
剩下一个问题,就是realValue怎么取得哪?
TextModification有一个value属性是Expression类型的,而Expression有实现了IExpression接口,也就是有一个GetValue的方法,那么realValue就可以这么写:
所以整个类就是:
到现在为止,这个组件基本上已经可以工作了,但是,不得不说一个问题,如果Xml配置错了,如何差错哪?下一篇将讨论一下这个问题。
上一篇:从写组件说Xml——接口和初步实现(四)
下一篇:从写组件说Xml——改良(六)
从写组件说Xml——实现(五)相关推荐
- jsx 调用php,JavaScript_JavaScript的React框架中的JSX语法学习入门教程,什么是JSX?
在用React写组件的 - phpStudy...
JavaScript的React框架中的JSX语法学习入门教程 什么是JSX? 在用React写组件的时候,通常会用到JSX语法,粗看上去,像是在Javascript代码里直接写起了XML标签,实质上 ...
- log4j.properties中的这句话“log4j.logger.org.hibernate.SQL=DEBUG ”该怎么写在log4j.xml里面呢?...
http://www.cnblogs.com/gredswsh/p/log4j_xml_properties.html 请问:log4j.properties中的这句话"log4j.logg ...
- [vue] 为什么我们写组件的时候可以写在.vue里呢?可以是别的文件名后缀吗?
[vue] 为什么我们写组件的时候可以写在.vue里呢?可以是别的文件名后缀吗? 也可以写为js,jsx,ts,tsx这种 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很 ...
- python response重头开始_你必须学写 Python 装饰器的五个理由
你必须学写Python装饰器的五个理由 ----装饰器能对你所写的代码产生极大的正面作用 作者:Aaron Maxwell,2016年5月5日 Python装饰器是很容易使用的.任何一个会写Pytho ...
- 计算机的收获初一作文,写收获的初一作文五篇
写收获的初一作文五篇 编者按:如果大家觉得内容不错,记得分享给你的小伙伴们哦!内容简介:一分收获等于一片耕耘.在人的世界中,我们难免会遇到困难,只要我们努力去克服,那一份收获,就会成为你的... 有兴 ...
- 良匠-手把手教你写NFT抢购软(五)
良匠-手把手教你写NFT抢购软(五) 前言 本篇文章接上上一篇,如何用易语言去请求刚刚分析的接口. 操作 打开上次做的模板,和精易编程助手,先导入精易模块,再复制代码进去. 点击精易编程助手上面的生成 ...
- firefox附加组件开发者指南(五)——创建一个firefox扩展(上)
本章篇幅较长,分上下两部分发布,本章中的图和清单4在原网站中没有,因此这里也没有,感兴趣的可以去原文补充.下面是译文. 至今为止,各个章节中独立的介绍了相关的技术--XUL.javascript.CS ...
- vue 自己写组件。
最近在网上看到很多大神都有写博客的习惯,坚持写博客不但可以为自己的平时的学习做好记录积累 无意之中也学还能帮助到一些其他的朋友所以今天我也注册一个账号记录一下学习的点滴!当然本人能力实在有限写出的文章 ...
- 锋利的jQuery--编写jQuery插件(读书笔记五)[完结篇]
1.表单验证插件Validation 2.表单插件Form 3.动态事件绑定插件livequery 可以为后来的元素绑定事件 类似于jQuery中的live()方法 4.jQuer ...
- html5如何快速选择工具使用技巧,写给PS新手们 五种快速抠图技巧连连看
1简单图像抠图法1:魔棒工具 不管是摄影还是制图,我们经常会使用到Photoshop这个神奇的软件.它能够秒杀世界上任何化妆品.减肥产品,也可以让你的世界从此变得与众不同.在我们后期的过程中,我们经常 ...
最新文章
- C#3.0-新增加功能浅析(1)
- 「赠书」贾扬清推荐,国内首本数据竞赛图书
- 关于meta name=viewport content=width=device-width, initial-scale=1.0, maximum-scale=1.0, user-sc..
- 框架学习之Hibernate 第十节 事务原理与分析
- 不会吸引人的JavaDocs源样本
- 剑指offer0JZ81 调整数组顺序使奇数位于偶数前面(二)(C++,附思路)
- Git笔记(27) 储藏与清理
- 1.UNIX 环境高级编程--UNIX基础知识
- 基于大数据架构实现景点游客数据分析平台,全国景点游客数据管理系统
- 《算法笔记》胡凡 例题/练习 答案
- 双线性插值公式推导及Matlab实现
- mindoc mysql_MinDoc 配置文件详解
- 实战1--航空公司客户价值分析(画图篇)
- NeRF 从入门到精通
- 自己整理出来的java实现打印机打印小票
- read 系统调用剖析
- 省钱兄游戏陪玩小程序APP源码uniapp前端源码适配支持(APP+小程序+H5)
- 如何在集群上运行Shark
- 跨省游拯救疫后旅游业:汝之蜜糖,彼之砒霜
- 闷声发大财的ARM凭什么这么牛