Jumony(一)从扩展方法到流畅的程序体验

Jumony(二)jQuery的设计艺术和选择器

Jumony(三)第一个公开预览版,在.NET里玩转jQuery选择器!

首先是兑现诺言,上一篇文章中曾经说到源代码会随下一篇文章的发布一同发布。其实我早已打包好了,现在提供下载地址:

http://files.cnblogs.com/Ivony/Jumony_CTP(20100802)_Source.rar

有人说里面漏了HtmlAgilityPack和Ivony.Fluent的源代码。这是因为这两个项目不是Jumony的一部分。HtmlAgilityPack是一个老外的开源项目,而Ivony.Fluent则是一些通用的扩展方法来辅助流畅体验的。不过为了方便大家,也提供这两个项目对应的源代码下载:

Ivony.Fluent的:

http://files.cnblogs.com/Ivony/Ivony.Fluent(ver.62).rar

HtmlAgilityPack的:

http://files.cnblogs.com/Ivony/HtmlAgilityPack(ver.62).rar

ver.62是SVN的内部版本号。

建议大家下载HtmlAgility最新的版本,也许修正了很多Bug,除非HtmlAgilityAdapter与其不兼容。

http://htmlagilitypack.codeplex.com/

其实也有计划做MSHTML的Adapter,但文档翻得眼睛花,暂时作罢。

这个CTP中其实还存在很多的问题,其中已知的问题都已经被修复,将不会在下一个CTP版本中看到,这些包括但不限于:

  • .className选择器被错误的解释成[class*=className],正确的应该是[class~=className]
  • SiblingsAfterSelf会错误的包含自身
  • HtmlBindingContext的Commit方法行为诡异
  • 等等等等。

这是Jumony系列中一篇比较短的文章,与大家一起来探讨Jumony的一些好玩的应用。上一篇文章有很多人留言说下载了Jumony的CTP,但我不知道到底大家有没有真正去玩。这个框架我是一边写,一边玩,玩的过程中产生了大量的需求,然后一一实现。废话不多说,先来看一个截图:

嗯,很明显,这是老赵的博客,似乎没什么奇怪的。但是等等,老赵啥时候写过这些文章?!

没错,这些文章都是博客园首页的!

当然这是一件很简单的事情,从博客园的首页摘取文章内容,再把它填到老赵的博客里面去。说起来似乎很容易,但真正做起来恐怕不是那么简单的事情吧。

那么我们来看看Jumony能够怎样帮助我们解决这种问题?

  public void ProcessRequest( HttpContext context )  {

    var client = new WebClient();

    client.Encoding = System.Text.Encoding.UTF8;

    var parser = new JumonyParser();

    var cnblogs = parser.Parse( client.DownloadString( "http://www.cnblogs.com/" ) );    var zhaojie = parser.Parse( client.DownloadString( "http://blog.zhaojie.me/" ) );

    var baseElement = cnblogs.GetNodeFactory().CreateElement( "base" );    baseElement.SetAttribute( "href" ).Value( "http://blog.zhaojie.me/" );

    zhaojie.FindSingle( "head" ).InsertCopy( 0, baseElement );

    zhaojie.Find( ".post" ).BindFrom( cnblogs.Find( ".post_item" ), ( cb, zj ) =>      {        zj.FindSingle( "h2 a" ).SetAttribute( "href" ).Value( cb.FindSingle( "h3 a" ).Attribute( "href" ).Value() );        zj.FindSingle( "h2 a" ).InnerText( cb.FindSingle( "h3 a" ).InnerText() );

        zj.FindSingle( ".entry strong" ).NextNode().ReplaceCopy( cb.FindSingle( ".post_item_summary" ).Nodes().Last() );

        zj.FindSingle( ".icon_comment a" ).SetAttribute( "href" ).Value( cb.FindSingle( ".article_comment a" ).Attribute( "href" ).Value() );        zj.FindSingle( ".icon_comment a" ).InnerText( cb.FindSingle( ".article_comment a span" ).InnerText() + " Comments" );

      } );

    context.Response.Write( zhaojie );

  }

真正干活的其实就五行代码,分别是,把文章的标题、标题连接、文章摘要、回复数量、回复量的链接复制过去。

 

注意,这段代码用现在发布的这个CTP版本是无法通过编译的,因为现在的这个CTP版本尚不支持InnerText这样的对文档进行修改的方法。

从这个例子我们也能看到C# 3.0的一些不足,如果我们用函数式的语言来写这段代码,就没有这么多乱七八糟的括号,语义也将更加流畅。

而如果用动态语言,我们甚至可以写成:

zj.FindSingle( "h2 a" ).href = cb.FindSingle( "h3 a" ).href;zj.FindSingle( "h2 a" ).text = cb.FindSingle( "h3 a" ).text;

zj.FindSingle( ".entry strong" ).next = cb.FindSingle( ".post_item_summary" ).nodes.last;

zj.FindSingle( ".icon_comment a" ).href = cb.FindSingle( ".article_comment a" ).href;zj.FindSingle( ".icon_comment a" ).text = cb.FindSingle( ".article_comment a span" ).text + " Comments";

这并不是痴人说梦,而是Jumony正在努力的方向。

借助CSS选择器,Jumony可以轻易地将HTML文档的表现形式和包含数据完全分离。

在这个例子里,我们可以看到这种流畅的感受,加载博客园的首页,将数据抽出,再加载老赵的博客,将数据填入。一气呵成,比XSLT的语法更为简洁。

当然,我们之所以可以轻易地做到这一点,也与语义网的普及密不可分,由于HTML越来越语义化,我们从中抽取数据的过程便越来越简单。但这并不代表对于脏乱的HTML我们就没有办法抽取,事实上只是麻烦一点而已。

其实,我们有什么必要去做模板呢?

如果你要高兴我的博客长得和老赵的一个样,用Jumony几行代码就搞定了。

Technorati 标签: Jumony

Jumony(外一)HTML和数据,同时发布第一个CTP源代码。相关推荐

  1. 阿里数加大数据平台发布,将培养5万大数据科学家

    1月20日,阿里云栖大会在上海召开,宣布了阿里大数据平台与大合作战略. "数加"平台,让大数据能力淘宝化 阿里云大数据事业部资深总监徐常亮宣布一站式大数据平台"数加&qu ...

  2. mysql添加数据不阻塞_主键表插入数据不提交,外键表插入数据被阻塞

    有客户和我说:他在含主外键的表中实验发现,在主表数据未提交,然后在外键表插入该数据数据时,出现外键表hang住现象.我开始以为是不同的会话,根据oracle数据库的一致性原则,应该新会话在外键表中不能 ...

  3. java 正则 括号外_正则表达式匹配括号外的符号及数据

    正则表达式匹配括号外的符号 [\\?!/\\.,\\s]+(?=[^\\)]*(\\(|$)) 将括号外的?!/.,和空格(连续多个时同时)匹配 如 String string1 = "sd ...

  4. 高权重的外链应该如何体现以及发布

    很多站长都会说外链不在于多,而在于精,同时还需要做到高权重高质量度的外链,但何为高质量的外链呢?在一些高权重的地方所发的外链就俗称为高质量的外链吗?高质量的外链如何体现呢?在平常的工作中应该如何做出百 ...

  5. MySQL中包含外键无法删除数据的解决方案

    1.在数据库连接信息加入以下代码,意思就是允许执行多语句查询. allowMultiQueries=true 2.在删除语句前面加上SET FOREIGN_KEY_CHECKS=0; 意思就是取消My ...

  6. 涉及个人数据的发布与共享

    小结 随着企业业务发展和扩大,数据库.大数据平台以及流动过程的数据越来越庞大,业务复杂多变, 其面临的数据安全问题和威胁越来越突出和严,不仅有来自外界的攻击,也有内部管理或错误配置等 引发的数据窃取或 ...

  7. 贵阳大数据交易所发布四份数据管理交易解决方案

    日前,贵阳大数据交易所发布<数据源管理办法><数据交易资格审核办法><数据交易规范><数据应用管理办法>四份解决方案,进一步探索大数据交易的规则与方向. ...

  8. Geoserver 图层数据服务发布(.shp)

    Geoserver 图层数据服务发布(.shp) Geoserver是一个功能齐全,遵循OGC开放标准的开源WFS-T和WMS服务器.利用Geoserver可以把数据作为maps/images来发布( ...

  9. 基于Java毕业设计大数据文章发布系统源码+系统+mysql+lw文档+部署软件

    基于Java毕业设计大数据文章发布系统源码+系统+mysql+lw文档+部署软件 基于Java毕业设计大数据文章发布系统源码+系统+mysql+lw文档+部署软件 本源码技术栈: 项目架构:B/S架构 ...

最新文章

  1. Android开发之详解五大布局
  2. [Oracle] oracle统计信息
  3. Android_NetWork_Test
  4. LeetCode之Island Perimeter
  5. Linux内存卡(SD卡、TF卡)作为Swap交换空间
  6. 网络游戏知识产权保护白皮书
  7. 【2021牛客暑期多校训练营5】Jewels(建图,最小匹配权,KM乱搞)
  8. 统计学习方法——第四章朴素贝叶斯及c++实现
  9. 2021河北计算机专接本考试复习资料
  10. 为了完成月入 3W 的目标,我都做了哪些准备?
  11. 直播平台源代码快速搭建视频直播平台
  12. 从随机生成九宫格至随机生成数独游戏再至用回溯法实现数独的解
  13. 有哪些好用的在线电影影视导航网站
  14. 极限存在准则 两个重要极限
  15. java继承extends
  16. 第一章 企业管理概论
  17. GB28181-2016 协议(一)
  18. 目前常见的大数据分析软件有哪些?
  19. lisp 画一个矩形
  20. 公司成立新单位,分公司和子公司哪个更好

热门文章

  1. 基于51单片机的课程设计(毕业设计)——电子贺卡
  2. VS2012 如何开发C语言
  3. 巨型计算机和人脑,超级计算机和人脑比谁更厉害?研究员测试后给出答案
  4. 敏捷史话(十六):我对《敏捷宣言》没有半点贡献—— Brian Marick
  5. 测试绝地求生显卡使用率软件,玩绝地求生需要什么显卡才能流畅运行?10系列显卡吃鸡游戏测试对比...
  6. 分享一个自定义的popuwindow效果,高度适配
  7. 计算从今天算起,100天以后是几月几号
  8. 水位测量是计算机在( )方面的应用,液位计在净化水处理水位测量方面的应用选择?...
  9. bim专用计算机,建筑bim对计算机的要求,最低配置是多少?
  10. 创乐博相机和迈德威视工业相机调参记录