Category Archives: XML

又上了名字空间的套

在做一个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

实现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

集成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

C#中使用Xslt 2.0处理器

用C#处理Xslt 2.0的时候,才发现原来.Net并没有提供对Xslt 2.0的支持,毕竟Xslt 2.0目前更多的还是纸面上的标准,而且微软的动作一向速度有限。 于是开始找专门的Xslt 2.0处理器。 首先找到的是Saxon,不知道是不是逐步商业化的缘故,Saxon版本显得有点凌乱。在9.1,分成商用的SA版,开源的B版;到了9.2又改成商用的EE企业版,PE专业版和开源的HE家庭版,加上每个版本又都分成java版和.Net版,看得都有点眼晕。 不管怎样直奔最新版本,先下了9.2 HE .NET版,结果发现处理中总是会有出现编码异常,貌似是Saxon的一个BUG,因为也其他有人碰到同样的问题,据说是换上9.1就没有好了。 于是换上9.1 B版,果然什么问题都没有了。察看文件9.2在支持库的部署方式上作了大的调整,可能是因为这个缘故导致的吧。(一个小问题,9.1中包含的IKVM.OpenJDK.ClassLibrary.dll,一个文件就26M,无论如此无法提交到Google Code,而在9.2中,这个大文件被分割成了几个相对小的问题) Saxon在调用上,最简单的方式是使用SaxonWarpper,代码类似.Net本身的方式。其实SaxonWarpper自己也不过是几行代码而已,所以直接调用Saxon也不会复杂到哪儿去,下面是一段处理Xslt 2.0的代码:         /// <summary>         /// 使用Saxon处理Xslt 2.0         /// </summary>         /// <param name="strXml">字符串形式的XML数据</param>         /// <param name="strXsl">字符串形式的XSLT数据</param>         /// <returns>处理后的XML字符串</returns>         public static string … Continue reading

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