引用
我在一篇文章《Web页面技术综述》中
http://blog.csdn.net/buaawhl/archive/2004/07/07/36326.aspx
提到了一种思路
2.6.DOM + XPath
前面讲了XMLC把HTML静态编译成DOM结构。
我们也可以采用动态生成DOM结构的方法,然后用XPath定位DOM结点并操作它们。
NekoHTML(http://www.apache.org/~andyc/neko/doc/html/)是一个HTML文档解析工具。
NekoHTML使用Apache Xerces(http://xml.apache.org/xerces2-j/index.html)的Xerces Native Interface对HTML文档进行解析,能够自动补足并修正不符合XML文法的HTML元素,并生成HTML DOM文档树。
Apache Xcerse的XPathAPI,可以用XPath方便地定位DOM结构的结点。DOM + XPath的详细用法请参见NekoHTML的使用文档。
优点:
大致具有上述XMLC方法的优点。
没有静态编译过程,动态生成DOM结构,及时反映页面文件的变化。
缺点:
大致具有上述XMLC方法的缺点。
DOM结构的动态生成比较花时间。我们可以采用这样的方法解决这个问题,把第一个生成的DOM结构作为标准模板。我们不对标准模板操作,每次请求需要一个DOM结构的时候,我们就从这个标准模板深度拷贝(deep copy)一个新的DOM结构,然后使用这个新的DOM结构。这样每个HTML文件只需要解析一次,成为标准模板。每次HTML文件更改的时候(这种情况很少),标准模板也跟着更新。
XPath的解析和定位速度不是很快,几乎每次都要遍历整个文档树。
http://www.jivan.org
后来发现,Jivan 就是这样的项目。思路就是采用 NekoHTML解析HTML文件,生成一个HTML DOM,然后操作DOM Node。而且确实采用了 DOM 深度Copy的方式获取一个新的DOM,避免重复解析同一个HTML。
Template技术主要分为两种:
1. 主动脚本 -- JSP, Velocity, Freemarker, Tapestry.
2. 被动资源 -- Jivan, JDynamiTe, fastm
(还有一种就没有Template了,直接就是Java Code HTML Generater, 比如,Echo, Wicket等。)
被动资源类别(Jivan, JDynamiTe, fastm),非常适合CMS, Portal等的 动态编辑定义布局功能。
其中的Jivan 模板是最干净的,一点杂质都没有。只要用 html tag 本身的 id (甚至其他任何属性,不用属性也可以,直接用xpath) 就可以。
JDynamiTe 和 fastm 还要用 XML Comment 和 {}。
而Tapestry则需要引入新的 jwcid 等属性。
在操作 HTML 资源方面,Jivan 也是最灵活强大的,能够改变、添加、删除任何一个HTML Node。
但是这里又有一个问题。不属于XML Node的部分,比如,Javascript 中的某部分语句需要动态生成,Jivan就无能为力了。当然,这种情况比较少见,即使有,也可以采用一些方法绕过去。
下面来看 Jivan 的 HelloWorld。
HTML部分。
Push your dynamic content into the HTML! Time is illusion
Java Code部分。
public static void main(String[] args) throws IOException { // load document DocumentManager man = DocumentFactory.getInstance() .docManFor("file:data\\html\\HelloWorld.html"); // push dynamic content into tree. Node timeSpan = man.lookup("time"); DOMUtil.setTextChild(timeSpan, new Date().toString()); // write HTML output to stdout man.serialize(System.out); }
我们看到,这段代码用 id = time 来寻找Node (是一个Span Element), 并设置 text。其实也可以用 xpath来直接定位。
理论上,这个HTML 里面的任何一个Node都可以被修改替换。