CYQ.Data.Xml XmlHelper 助你更方便快捷的操作Xml/Html

关于爱说说在技术选型的文章见:"爱说说"技术原理方案的定选思考过程

 

本篇将讲述“爱说说”比较重大的技术问题点及解决手段:

 

爱说说:http://speak.cyqdata.com/

 

杂说几句:

一开始,原本是打算在秋式开源团队找一JS人才来引导前台页面的呈现的,毕竟本人在JS还停留在原始的编码阶段,于是当时聊了一下。

再后来,接下来几天,由于秋式开源团队内部管理上有点小调整,还有新开任务小组的事,连续忙了几天,“爱说说”就也停了几天。

几天过后,回到群里Call人,发现原来JS的人才一去无踪影了,没法只好自己动手了。

 

在定好技术方案后,下面开始技术的分析:

 

爱说说”的逻辑:

前端html-》发送ajax请求-》后端ashx处理并返回Json-》前端接收Json并解析显示

 

从后端Ashx说起:

 

一:TXT文本交互的技术解析

 

1:数据写入:每次往文本的最后面写一条Json数据,语句很简单:

        public void AppendText(string appendText)
        {
            File.AppendAllText(FilePath, appendText);
        }

利用System.IO.File类即可轻松处理。

 

2:数据读取:内存表缓存失效时,需要重新加载TXT文本的Json数据,语句也很简单:



        public string LoadText()
        {
            return File.ReadAllText(FilePath);
        }




还是一行代码,处理简单。

 

3:删除功能:需要移除TXT文本内的某行Json数据,也很容易的说:



        public void RemoveText(string removeText)
        {
            File.WriteAllText(FilePath, File.ReadAllText(FilePath).Replace(removeText, string.Empty));
        }




还是一行的说,读完替换,然后重新写入。

 

OK,和IO的交互设计,相当的简洁,也就这三个函数了,写,读,删除。

 

二:Json的交互的技术解析

 

1:数据如何写入:

从上面的分析上看,提交肯定是一行一行的数据,于是每次写入都是一条Json语句。

 

2:功能冲突:这和CYQ.Data.Table下的MDataTable的功能有什么冲突?

MDataTable有ToJson功能,也有LoadFromJson功能,能把数据表转成Json,也能从Json解析还原成内存表。

那数据行有没有ToJson功能?答案,没有!

替换方案可有?答案,有! 可以MDataRow.ToTable().ToJson(),即转成表格再输出Json,看似挺好。

在好之前,看一下MDataTable的ToJson()输出什么?

{"count":"2","error":"","success":"true","data":[
{"ID":"2","ParentID":"-1","UserID":"2","NickName":"dddd","Body":"aaddd","CreatedOn":"2011-4-24 0:22:21"},
{"ID":"1","ParentID":"-1","UserID":"1","NickName":"dddd","Body":"aaaaa","CreatedOn":"2011-4-24 1:19:37"}]}

格式就是这个了,前面是一些共有属性,data内才是数据行。

如果每次把这样的数据写完文本,到时候读取解析还原成表格,肯定有问题。

 

3:如何解决冲突:扩展功能,为单独的数据行添加ToJson()功能

只单独输出:

{"ID":"2","ParentID":"-1","UserID":"2","NickName":"dddd","Body":"aaddd","CreatedOn":"2011-4-24 0:22:21"}

这样子,重复的往后写,感觉就省了点字节,而且也清爽秀多。

 

4:扩展再扩展:MDataTable.LoadFromJson要支持上





不过这么重复的写单行Json数据,再读取,MDataTable是解析不了的,咋整?



解析不了就扩展一下,把它解析了,由于CYQ.Data的Json,都是本人手动写的解析。



所以,修改来解析这样一行一行的数据,还是可以处理的。三改两改就支持上了,一切很好。







 

现状就是可以往TXT里写出这么一系列的文本了:





{"ID":"1","ParentID":"-1","UserID":"1","NickName":"小样...","Body":"爱说说...有话就说",第一个哟哟","CreatedOn":"4/20/2011 8:35:10 AM"}



{"ID":"2","ParentID":"-1","UserID":"2","NickName":"路过秋天","Body":"不知道怎么回事说,随便来几字,明字何期多。","CreatedOn":"4/20/2011 8:37:35 AM"}







再然后就是MDataTable.LoadFromjson又可以从这种格式还原成内存表了。

 

技术手段到了这里,光明灿烂了。

 

一切流程很好:





1:客户端提交数据-》



2:Ashx提交数据-》写入内存表,然后把数据行ToJson写入文本。



3:内存表在内存,总有失效的时候,失效时LoadFromJson又还原成表格,又继续。







 

5:另一个重大的技术问题

一切看似很好,可是后面还是会有些问题呢的,什么问题?往下看:

 

看一下表格的原始属性:

内在表定义:        private static MDataTable _Table = null;//内存数据表

 

表格的基本列:


                        _Table.Columns.Add("ID", SqlDbType.Int);//ID标识
                        _Table.Columns.Add("ParentID", SqlDbType.Int);//>0说明是回贴
                        _Table.Columns.Add("UserID", SqlDbType.Int);
                        _Table.Columns.Add("NickName", SqlDbType.NVarChar);
                        _Table.Columns.Add("Body", SqlDbType.NVarChar);//内容
                        _Table.Columns.Add("CreatedOn", SqlDbType.DateTime);//创建日期


 

问题:

在开始定义前,都是有不同的类型的,但如果内在表失效时,重新还原又是什么状况?

由于Json全是字符串,在还原为内存表MDataTable时,默认全都置为SqlDbType.NVarChar,

于是表格的字段类型全变字符串了,如果只是还原后用于绑定显示就没啥问题了,如果此表格还需要进行一些复杂判断比较,就比较纠结了。

正如我要查询ID>数字的行,全是字符串就真的很纠结。

 

如何解决?

 

想法一:有想法不是办法:

开始纠结还原后的数据类型问题,通过判断第一行Json的文本值,来定义设置字段类型,比如:

检测值是数字型:就Int。

检测值是日期型:就DateTime

最后就默认给:NVarChar

 

为何不是办法?

看似挺好,如果文本字段内容第一行是数字,其它行又是字符串呢?后面的内容不就纠结了?

 

想法二:有想法也是办法:

既然首行取值判断不行,如果首行存表架构呢?

首行Json字段架构如下:

{"ID":"System.Int32","ParentID":"System.Int32","UserID":"System.Int32","NickName":"System.String","Body":"System.String","CreatedOn":"System.DateTime"}

于是,解析时,就可以准确的还原了,那如何输出这行架构行?

于是,MDataColumn也多了个ToJson功能,用于输出表架构,至此,Json的交互方面,也大功告成了!

 

三:总结

 

解决了这两个重大的技术难题,接下来的,还有没有其它技术问题?



有,查询功能,即将扩展的MDataTable.Select(......)功能。



 

还有没有?

大的没了,还有就是技术细节问题了,如:接收参数,定义文本路径,定义最大行ID等。

 

下节解说,敬请期待。

 

关注点:MDataTable在“爱说说”扩展了这么多强劲的功能,啥时候发布?

很快,可能是五一前后:会在 CYQ.Data V4.5正式版中集成,也敬请期待与关注。

版权声明:本文原创发表于博客园,作者为路过秋天,原文链接:

http://www.cnblogs.com/cyq1162/archive/2011/04/24/2026235.html

时间: 2024-10-27 20:48:17

CYQ.Data.Xml XmlHelper 助你更方便快捷的操作Xml/Html的相关文章

[Qt教程] 第28篇 XML(二)使用DOM创建和操作XML文档

[Qt教程] 第28篇 XML(二)使用DOM创建和操作XML文档 楼主  发表于 2013-5-21 22:00:51 | 查看: 475| 回复: 0 使用DOM创建和操作XML文档 版权声明 该文章原创于作者yafeilinux,转载请注明出处! 导语 在上一节中我们用手写的方法建立了一个XML文档,并且用DOM的方法对其进行了读取.现在我们使用代码来创建那个XML文档,并且对它实现查找.更新.插入等操作. 环境:Windows Xp + Qt 4.8.4+QtCreator 2.6.2

CYQ.Data V5 MDataTable 专属篇介绍

前言 以前一两个月才出一篇,这三天有点变态地连续1天1篇(其实都是上周末两天写好的存货). 短期应该没有新的和此框架相关的文章要写了,这应该是最后一篇,大伙且看且珍惜. 前两篇讲数据库读写分离和分布式缓存,这篇隆重地介绍一下:MDataTable,毕竟它有很多未公布或隐藏技能,值得一看. CYQ.Data 核心使用类介绍 常用: 1:操作数据库:MAction.MProc (名称空间:CYQ.Data) 2:日志操作:Log.SysLogs(名称空间:CYQ.Data) 3:配置和性能调试:Ap

CYQ.Data 轻量数据层之路 优雅V1.4 现世 附API帮助文档(九)

继上一版本V1.3版本发布到现在,时隔N天了:[V1.3版本开源见:CYQ.Data 轻量数据层之路 华丽V1.3版本 框架开源]   N天的时间,根据各路网友的反映及自身的想法,继续修改优化着本框架,力求让大伙相对满意: 对于:bug反馈.优化建议.及最新框架版本下载见:CYQ.Data 轻量数据层之路 bug反馈/优化建议/框架下载 升级说明: 本次升级只是针对易用性增加功能或优化代码及方法,并未发现V1.3版本存在任何bug, 因此,对于V1.3版本,大伙可放心使用,同时也已开放源码. 若

使用qt5操作xml文件,删除xml文件中的节点和修改xml文件节点的数据值

问题描述 使用qt5操作xml文件,删除xml文件中的节点和修改xml文件节点的数据值 使用qt5操作xml文件,删除xml文件中的节点和修改xml文件中节点的数据值. 那位大神知道,如果有代码就更好了. 谢谢 解决方案 QT XML文件 修改节点修改XML文件的节点属性值

php中操作xml文档程序代码

 代码如下 复制代码   /* <?xml version="1.0" encoding="UTF-8"?> <班级> <学生 number="101"> <名字>孙悟空</名字> <名字>孙行者</名字> <年龄>猴精猴精</年龄> <介绍></介绍> </学生> <学生 number="

用javascript操作xml

javascript|xml <script language="JavaScript"><!--var doc = new ActiveXObject("Msxml2.DOMDocument"); //ie5.5+,CreateObject("Microsoft.XMLDOM") //加载文档//doc.load("b.xml"); //创建文件头var p = doc.createProcessingIn

C#操作XML增删改查

原文:C#操作XML增删改查 XML文件是一种常用的文件格式,不管是B/S还是C/S都随处可见XML的身影.Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具.XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用.微软也提供了一系列类库来倒帮助我们在应用程序中存储XML文件.     "在程序中访问进而操作XML文件一般有两种模型,分

CYQ.Data 轻量数据层之路 V3.0版本发布-Xml绝对杀手(三十二)

前言: 继正式发布V2.0到现在,已30来天了,一直静悄悄的都没发布什么版本 中间仅有插播了一下:CYQ.Data 轻量数据层之路 V2.5 抢先体验版本功能说明演示 (二十九)   只因最近花了很多时间在重构一个以前的博客,目前已完成其基础功能,不日将发布相关文章. 提前预览网址:http://www.cyqdata.com/     本次版本升级内容大体说明: 1:Access应用调整2:修正对:uniqueidentifier.ntext.text.Image等几个类型的应用.3:扩展缓存

CYQ.Data 轻量数据层之路 V4.5 版本发布[更好的使用体验,更优的缓存机制]

前言: 继上一版本:CYQ.Data 轻量数据层之路 V4.3 版本发布[增加对SQLite,MySQL数据库的支持] ,至今已快近3个月了,中间仅有V4.5beta版本供下载,却没正式发布,今天,终于要把V4.5给发布了.   下面看一下新版本的修改记录 实用: 1:MAction:Select方法增加重载:Select(string where); 2:FormatWhere处理了"Parent is null"的"is"关键字;处理"order by