Tag Archives: 实体

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