Tag Archives: XHTML

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

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