以读取博客园随笔备份为例 将xml 序列化成json,再序列化成对象

本文转载:本文转载:http://www.cnblogs.com/codealone/archive/2013/04/14/3020161.html

在线JOSN编辑器http://tools.jb51.net/tools/json/json_editor.htm 非常强大!

资源下载http://files.cnblogs.com/codealone/ConsoleApplication2.zip

Json查看工具:http://files.cnblogs.com/codealone/JsonView.zip

在线代码格式化:http://www.ostools.net/codeformat/xml

博客园随笔备份之后,得到的文件格式如下:

  

  我们要读取上述xml,主要是获得channel节点下的所有内容,在平时的工作过程中,觉得json数据要比xml更加容易操作些,于是想,能不能将其转换成json格式,进一步转换成对象。下一步的工作则是将 rss节点下的内容,转换为json。

  主要代码如下:

            var xml = File.ReadAllText(@"D:\cnblogs.xml");//该xml为博客园随笔备份文件
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xml);
            //获取rss节点下的内容
            var channelXml = doc.SelectSingleNode("rss").InnerXml;
            //进一步细化xml格式,内容仅为rss节点下的内容
            doc.LoadXml(channelXml);
            //将xml序列化成json,并且去掉根节点
            var json = JsonConvert.SerializeXmlNode(doc,Newtonsoft.Json.Formatting.None,true);

 

此时json的内容如下:
    

此时由xml到json的转换就完成了,下一步,则是如何将json转换成对象。通过查看上述json的结构,将每个节点看作一个对象,很容易定义出数据结构,具体如下:

       public class Channel
        {
            public string title { get; set; }
            public string link { get; set; }
            public string description { get; set; }
            public string language { get; set; }
            public string lastBuildDate{ get; set; }
            public string pubDate { get; set; }
            public string ttl { get; set; }
            public List<Channel_Item> item { get; set; }
        }

        public class Channel_Item
        {
            public string title { get; set; }
            public string link { get; set; }
            public string author { get; set; }
            public string pubDate { get; set; }
            public string guid { get; set; }
            public Item_Description description { get; set; }
        }

        public class Item_Description
        {
            //默认以变量名称作为json序列化的节点,由于该节点内容不符合变量定义规范,则显示指定即可
            [JsonProperty("#cdata-section")]
            public string content { get; set; }
        }

 

最后一步,则是将刚刚得到的json序列化成我们定义的数据结构:

            var channel = JsonConvert.DeserializeObject<Channel>(json);

到此为止,我们将xml转换成对象的工作就完成了,打印读取的内容:

  

 

问题:

  在实际的测试过程中,发现如果备份文件中,仅有一个item节点的时候,序列化后的json item部分如下: 

{
    "item": {
        "title": "测试",
        "link": "http://www.cnblogs.com/codealone/archive/2013/04/14/3020195.html",
        "author": "冲动",
        "pubDate": "Sun, 14 Apr 2013 04:37:00 GMT",
        "guid": "http://www.cnblogs.com/codealone/archive/2013/04/14/3020195.html"
    }
}

此时是不可以直接序列化成List<Channel_Item>对象,针对此情况,不想更多的去改变代码,在item仅有一个的时候,手动添加一个空节点,此时对应的json为:

"item": [
    {
      "title": "测试",
      "link": "http://www.cnblogs.com/codealone/archive/2013/04/14/3020195.html",
      "dc:creator": {
        "@xmlns:dc": "http://purl.org/dc/elements/1.1/",
        "#text": "冲动"
      },
      "author": "冲动",
      "pubDate": "Sun, 14 Apr 2013 04:37:00 GMT",
      "guid": "http://www.cnblogs.com/codealone/archive/2013/04/14/3020195.html",
      "description": {
        "#cdata-section": "<p>测试内容</p>"
      }
    },
    null
  ]

上述json格式就可以轻松的序列化成List<Channel_Item>对象了。

时间: 2024-09-28 08:31:18

以读取博客园随笔备份为例 将xml 序列化成json,再序列化成对象的相关文章

博客园随笔添加自己的版权信息

这几日,看了一些博客.发现在一些博客的底部添加了一些版权信息,很新颖.如下图: 写信给博客园的客服,问如何做出来的.回复是添加自己的"签名".无语了,只能自己研究了. 在分析了别人的页面后,终于摸索出制作方法.效果看文末的"版权信息".现在把制作过程公开,和大家探讨. 先点"维护签名",进入到制作签名的页面.在"内容"的文本框输入如下信息: <div>作者:<a href="http://grene

C# 读取 博客园 Rss 的新闻数据

.cs /// <summary> /// 获取博客园新闻Rss数据 /// </summary> /// <returns></returns> [HttpPost] public JsonResult GetRssXmlDoc() { XmlDocument doc = new XmlDocument(); IList<RssXml> rssXmls = new List<RssXml>(); try { //加载Xml文件 do

微信小程序实现博客园文章阅读功能

在微信小程序开发中,我们可以根据不同的业务场景,开发不同的业务应用,可以基于自身域名服务接口,也可以基于第三方的域名接口进行处理(如果被禁用除外),本篇随笔介绍使用小程序来实现我博客(http://wuhuacong.cnblogs.com)的文章阅读功能,这个小程序主要用来介绍使用介绍基于Javascript的正则表达式的处理应用,和常规在C#里面使用正则表达式有一些差异,因此可以作为后续使用正则表达式处理业务数据的一个练兵吧. 1.Request接口合法域名配置 一般情况下,我们知道微信的R

将博客园(cnblogs.com)数据导入到wordpress的代码_php实例

我将这个分享出来,如果以后有谁需要可以直接下载下面插件 使用方法: 在cnblogs选择备份数据,导出一个XML到本地: 下载附件中的插件,安装至\wp-content\plugins目录: 后台开启插件后,可以在"工具"中找到"Cnblogs数据转换",进入: 选择刚才下载的XML文件,上传后系统会自动将数据转换并导入到wordpress中 备注: 这个插件只是单纯将博客园日志.随笔.文章导入到wordpress中,不会导入评论相册数据,因为cnblogs不提供这

在Web微信应用中使用博客园RSS以及Quartz.NET实现博客文章内容的定期推送功能

本篇随笔介绍在Web微信应用中使用博客园RSS以及Quartz.NET实现博客文章内容的定期推送功能,首先对Quartz.NET进行一个简单的介绍和代码分析,掌握对作业调度的处理,然后对博客园RSS内容的处理如何获取,并结合微信消息的群发接口进行内容的发送,从而构建了一个在Web应用中利用作业调度来进行消息发送的业务模型. Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等. Quartz.NET允许开发人员根据时间间隔(或天)

【超详细教程】使用Windows Live Writer 2012和Office Word 2013 发布文章到博客园全面总结

原文 http://www.cnblogs.com/liuxianan/archive/2013/04/13/3018732.html 去年就知道有这个功能,不过没去深究总结过,最近有写网络博客的欲望了,于是又重新拾起这玩意儿. 具体到底是用Windows Live Writer 2012还是用Word 2013,个人觉得看个人,因为这2个软件各有优点,各有缺点. 1.首先用LiveWriter发博客显然更专业,发布后的效果也与本地最接近,但是在编辑功能上肯定大不如Word,另外一个最大缺点是它

PHP仿博客园个人博客数据库与界面设计

自学PHP大半年多了,断断续续地,但是最终还是坚定了我的想法,将PHP继续下去,所以写这个PHP的博客是为了找个稳定的 PHP工作,不求工资多高,但求一收留之地.我能看懂大部分英语文档,人不蠢,爱学习,有兴趣地可以联系下!有诚意的来吧!qq:240382473 我会分3-5次发布所有关键代码和文档说明,博客后台所有的样式均套用博客园! 说明: 1. 不完全采用MVC架构,但是理念就是这样的.因为还不能写出很稳定的MVC架构. 2.几乎不采用JQUERY AJAX 因为不是特别熟悉,运用起来还不自

谈谈博客园和写博客,以及通过博客遇到的那些人

    不知不觉,博客园园龄已经5年11个月了,还曾依稀的记得,那是研究生毕业设计搞完了,有没有什么事情可以做,只能每天背个屌丝的书包去学院机房,狂赚CSDN积分,曾经高峰期的时候CSDN积分达到16000分,不过由于这几年免费分享给Newlife群使用,已经只剩下500分了.发现博客园后,才知道CSDN是多么的烂,好吧我不说CSDN,影响心情.说说这些年在博客园吧. 本来很早就想写这篇文章,只是今天心情很特别,正好把手上哪些蛋疼的方案和报告写完之后,就分享一下心得吧. 1.关于对博客园的看法

PHP仿博客园 个人博客(1) 数据库与界面设计_php实例

自学PHP大半年多了,断断续续地,但是最终还是坚定了我的想法,将PHP继续下去,所以写这个PHP的博客是为了找个稳定的 PHP工作,不求工资多高,但求一收留之地.我能看懂大部分英语文档,人不蠢,爱学习,有兴趣地可以联系下!有诚意的来吧!qq:240382473 我会分3-5次发布所有关键代码和文档说明,博客后台所有的样式均套用博客园! 说明: 1. 不完全采用MVC架构,但是理念就是这样的.因为还不能写出很稳定的MVC架构. 2.几乎不采用JQUERY AJAX 因为不是特别熟悉,运用起来还不自