Category Archives: 我爱开源

又上了名字空间的套

在做一个XML的XSL,原XML如下: <?xml version="1.0" encoding="utf-16"?> <book version="5.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns="http://docbook.org/ns/docbook">   <info>     <title>test</title>     <author>       <personname>         <othername>Unknown</othername>       </personname>     </author>     <bibliosource>Unknown</bibliosource>   </info> </book> 制作的XSL: <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">     <xsl:template match="info">         <xsl:value-of … Continue reading

Posted in Jeebook, XML | Tagged , , | Leave a comment

XHTML解析的实体问题

我在《集成Html Tidy》一文中说过使用HtmlTidy转换HTML以方便使用XML解析器解析,事实上,并没有那么简单,随便解析几个XHTML就会碰到解析异常的问题,错误是“Reference to undeclared entity ‘nbsp’”。 查找原因发现,在XML中,除了&lt; &gt; &amp; &apos; &quot;以外,其他如&nbsp;之类的实体必须通过DTD或其他方式定义。Html Tidy转换出的XHTML并没有显式定义这些实体,而是采用类似以下的定义: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 在这个DTD中会定义如&nbps;之类的实体,但由于需要到W3C的网站上去获取这些定义,所以XML解析器默认会忽略这些定义,就导致没有定义的异常。 不过在.net中提供了XmlResolver类帮助处理这种情况,而我们需要做的就是重写这个类,并将XHTML中定义的DTD重新指向我们指定的某个位置,如上的情况操作如下: 1. 下载http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd 2. 将下载的dtd作为资源放入程序中 3. 重写XmlResolver类,增加判断,当传入的路径为"-//W3C//DTD XHTML 1.0 Transitional//EN" 时就以流方式返回资源中的DTD 4. 创建XmlReader,并将重载的XmlResolver设置在XmlReader中 5. 使用该XmlReader装载解析XHTML 完成以上步骤,再解析XHTML就不会再有异常出现了。当然XHTML的DTD定义不止这一种,为了兼容起见,最好将所有的DTD定义都按以上的步骤加入程序中。 具体实现代码可以参考我的开源项目:Page Releaser

Posted in PageReleaser, 我爱开源 | Tagged , , | Leave a comment

UrlRewritingNET实现URL Rewrite

在asp.net中实现URL Rewrite,除了IIS本身带的URL Rewrite Module以外,还有很到其他的解决方案,比如UrlRewritingNET。 UrlRewritingNET号称除了文件扩展名Rewrite需要IIS支持以外,其他所有操作都不需要IIS设置,这当然对虚拟主机的网站来说是非常便利的。 下面看看怎么来部署UrlRewritingNET: 1. 首先将下载的dll放置到bin目录 2. 修改Web.config,增加UrlRewritingNET的相关配置如下: <?xml version="1.0"?> <configuration>     <configSections>         <section name="urlrewritingnet"                  requirePermission="false"                  type="UrlRewritingNet.Configuration.UrlRewriteSection, UrlRewritingNet.UrlRewriter"/>     </configSections>     <urlrewritingnet rewriteOnlyVirtualUrls="true"                    contextItemsPrefix="QueryString"                      defaultProvider="RegEx"                      xmlns="http://www.urlrewriting.net/schemas/config/2006/07">         <rewrites>             <add name="category"                  … Continue reading

Posted in Jeebook, 软件技术 | Tagged , | Leave a comment

HTML页面之间的参数传递的局限性

动态网页传递参数比较简单,如果想在HTML之间传递参数就需要一点技巧,摘录两种方法如下: 采用字符串解析的: /* *函数功能:从href获得参数 *sHref:   http://www.cscenter.com.cn/arg.htm?arg1=d&arg2=re *sArgName:arg1, arg2 *return:  the value of arg. d, re */ function GetArgsFromHref(sArgName) {      var sHref= document.location.href;     var args  = sHref.split("?");     var retval = "";     if(args[0] == sHref) /*参数为空*/     { … Continue reading

Posted in Jeebook, 软件技术 | Tagged , , | Leave a comment

实现HTML的简单压缩

PageReleaser需要一种HTML的压缩算法,Google了很久,发现如果只是简单去除空白和注释的话,使用XLinq就可以轻易的实现 先看看MSDN是怎么说的: 一种常用方案是读取缩进的 XML,在内存中创建一个没有任何空白文本节点(即不保留空白)的 XML 树,对该 XML 执行某些操作,然后保存带缩进的 XML。在序列化带格式的 XML 时,只保留 XML 树中有意义的空白。这是 LINQ to XML 的默认行为。 另一个常见的情况是读取和修改已经有意缩进的 XML。您可能不想以任何方式更改这种缩进。若要在 LINQ to XML 中执行此操作,您要在加载或解析 XML 时保留空白,并在序列化 XML 时禁用格式设置。 简单的说,XDocument载入时,默认使用LoadOptions::None,自动去掉XML的空白;保存时,默认使用SaveOptions::None,自动格式化XML。 也就是说,使用XDocument将一个HTML文档打开什么也不作就保存,其实等于实现了HTML的格式化。 而如果在保存时,使用SaveOptions::DisableFormatting参数,看似要保存XML的空白,由于载入时所有空白都被删掉了,其实等于删除了所有空白,于是去掉空白就这样实现了。 至于删掉注释也很简单,只是需要注意,一般页面嵌入JavaScript会使用注释节点包裹,需要例外处理。 整个HTML压缩代码如下: var nodes = from s in doc.DescendantNodes() where … Continue reading

Posted in C#, PageReleaser, XML | Tagged , , | Leave a comment

开源项目:Page Releaser

使用js框架+Ajax模式的开发,总会造成大量的js文件导致网站传输效率降低,尤其在网络状况不佳的环境很容易出现整个网页无法使用,就如IE的那个经典错误,对象不支持此属性或方法。 js压缩合并的工具很多,我也基于JsMin做过JsMin#。不过因为调试的需要,仍然需要维护一个调试用得HTML,里面引用所有未压缩的js;再维护一个发布用得HTML,用来引用合并后的js。每次更新网页都非常不方便。 此后,开始构思更好的方法,于是有了Page Releaser的构想。 Page Releaser借鉴了C++中Release的概念,通过解析HTML提取js和css信息,并对它们进行压缩,合并,嵌入,再依照处理结果重新构建HTML,最终生成一套完整的发布版本。之所以叫Page,是因为它每次只处理一个HTML。(本来打算叫WebReleaser,但多HTML会牵涉到资源网页间共用的问题,比较复杂,自动化结果会很难评估。不过好在,像ExtJS这样的大型框架,任何应用一个HTML就够了:) Page Releaser的终极目标是将包含一个HTML,N个JS,N个CSS,N个图片的网站,最终压缩成一个HTML和一个图片,以最大的减少浏览器因为建立连接造成的效率浪费。 当然,浏览器建立最少的连接并不意味着网站就有最优化的效果,比如一张1000*1的图片和一张1*1000的图片无论怎么合并,生成新图片都会比原来的图片大得多,所以Page Releaser也提供各种参数以便产生针对性的最好效果。 目前放出的版本只是实现了js的压缩,合并,嵌入以及css的合并,嵌入,其他功能将逐步加入 Page Releaser安装 当然按照惯例,小工具一概开源,大家也可以自行下载代码编译: Page Releaser源码

Posted in PageReleaser, 我爱开源 | Tagged , , | Leave a comment

集成Html Tidy

解析HTML最大的问题是不能使用标准的XML解析器,虽然很多新的网站开始逐步改用规范的XHTML,但只有出现一个<br>就会导致整个解析过程的失败,而好的HTML解析器却不是那么容易找到的,所以转换或许也是一个很好的选项 在google这个问题的时候,发现一个好东西HTML Tidy,W3C出品的,开源的小工具,可以将HTML转换成XHTML或XML HTML Tidy提供了编译好的exe文件,所以最初尝试在程序中通过进程方式直接调用,转换的速度很快,不过会出现一个控制台的黑窗口,大量处理时会比较麻烦。 后来查找Tidy的衍生库,发现EfTidy.net。EfTidy.net采用Warp技术,将C++的库直接引入到C#的项目中,用C#调用非常简单。可惜的是,这明显是老外的作品,没有考虑编码的问题,中文会被自动转换为类似#C2C8;这样的Unicode编码,显然这是无法忍受的。 之后又找到了Tidy的纯C#代码编写的库Tidy.net,虽然版本有点老且很难随Tidy的源版更新,不过毕竟是同源的C#代码,什么编码,语言之类的问题统统不存在,于是集成转换的问题解决了。 P.S. Tidy有很多各种各样的库,还有如Mark Tidy之类的,各有特点,大家有空可以试试,好用的话记得推荐给我哦:)

Posted in XML, 我爱开源 | Tagged , , , | 2 Comments

开源的私人项目???

今天在Google Code上逛的时候,碰到一个项目,介绍就写了八个字,“私人项目,非请勿入”。 不禁想到之前参加一个软件方面的培训,吃饭时,一个同行问大家,除了Google Code还有什么方便的代码库没有? 当时推荐他SourceForge,他细致的问了半天,最后得出不能用的结论,原因是无法限制别人下载他提交的代码 疑惑。。。半天才明白他的意思。 原来他需要和外网的人共享代码库,于是想用开源平台的代码库,但又不想开放代码。 这么用开源平台,无语中。。。。。 类似Google Code这样的在线代码库的确非常方便,我为了享受这种便利提交了不少代码,当然一旦提交,项目就不再“私人”了,于是索性开源。 但像文章开始的八字声明,就如同穿着“新装”的皇帝一边自己大大咧咧的裸着,一边又警告别人非礼勿视,未免有点可笑了。

Posted in 我爱开源 | Tagged , | Leave a comment

我的开源项目

受惠于开源太多,开放一些小部件也算是某种回馈。其实,很多时候并不是开不开的问题,而是怎么开的问题。这里要特别感谢Google Code提供了如此简单便利的网站,让我很多时候不禁的想,不开源项目怎么管理:) 以下是目前已存在项目的清单,Google Code上的项目并不一定提供Release的版本,请大家自行使用SVN工具获取代码,如有问也题可直接在此留言,谢谢! 网站: My Tools Package – 提供一些小工具的Release版,不定期更新 Google Code项目: mytools360 – My Tools Package网站工具的源码 jeebookstore – 基于ExtJS的简单文档管理系统 sscs – 一个基于SDL的界面库

Posted in 我爱开源 | Tagged , | Leave a comment

ExtJs的Ajax乱码问题

最近用ExtJS+Ashx开了一个小的开源项目JeebookStore. 之前一直用的英文做的测试都也没感觉有啥问题,上周末一上中文,乱码问题就骚扰了我一个周末。 最开始是FormPanel发送的数据到ashx的时候出现乱码,Google了一下这样的问题还挺多,把所有js和html转存为UTF-8,然后把调用js的html设置为UTF-8编码,当然Asp的Request和Response保持默认的UTF-8,Firefox上就没有乱码的问题了。 再试IE,发现FormPanel内的数据已经没有问题,但通过URL参数传递的中文还是不对。依次尝试使用escape,encodeURI,encodeURIComponent函数对URL进行编码,没有效果。 多次试验下发现如果使用Form.submit函数的params属性来传递参数,并且method为GET时,IE下的表现就是正常的。如: URL: ashx/AddFile.ashx?name=中国&path=/中国 Form.submit({     url : ‘ashx/AddFile.ashx’,     method : ‘GET’,     params : {         name : ‘中国’,         path : ‘/中国’;     } }) 检查Action.Submit类的代码,发现ExtJS会在submit时使用params来拼接成如上的URL,之所以没有出现乱码,是因为分别对每个值进行了编码,而编码用的函数正是encodeURIComponent,只不过不像我之前那样直接对整个URL调用而已。 这番折腾又应了那句话,不合常理的问题往往是函数调用的问题。 总算IE和Firefox都可以正确处理中文了,可事情还没完,下载文件的文件名在FireFox变乱码了,当然还不算太乱,只不过是%E7%E9之类的显示而已。 检查发现我在返回文件名时,使用Server.UrlEncode对文件名做了UTF-8的编码,如果直接返回文件名则FireFox正常了,但IE同时变乱码,这次是彻底的乱码。貌似是因为FireFox对文件名的解析采用了ISOxxxx-1的编码而不是Http头中记录的编码类型。Google+研究了半天貌似没有好的解决办法,只好在ashx中做了浏览器的分支,即: HttpBrowserCapabilities bc = HttpContext.Current.Request.Browser; if … Continue reading

Posted in 我爱开源 | Tagged , , , | 3 Comments