XPATH 所使用的表达式语言,主要由两个部分组成: 表达式语言和xpath的路径搜索表达式.
1. 表达式语言, 由+, -, *, /, or, and, not和数值,字符串,函数等组成, 符合正规语法.
2. XPath路径搜索表达式, 是指在xml文档中搜索某个xml node的表达式.比如/books/book,搜索books节点下的所有book字节点. 具体可以参考www.w3c.org中关于xpath的描述。
要实现一个完整的xpath解析器,基础就是实现其表达式语言解析和xpath路径搜索。由于目前只实现了xpath路径搜索部分,这儿只简单介绍路径搜索的实现办法。
xpath路径表达式的主要组成部分是3个:
分隔符:"//", "/", '[', ']', ":",...
节点名:如/books/book路径, books和book都是节点名。
属性名:如/books/book[@title="123*"], title就是一个属性名
xpath路径表达式也完全符合正规表达式,其词法分析和语法分析有3种实现办法:状态机语法分析,正则表达式比配,以及lex/yacc. 状态机语法分析实现和维护都很方便,缺点是要代码实现不是很容易扩展;正则表达式匹配容易实现,也容易扩展,缺点是性能交差;lex/yacc也容易实现和扩展,缺点是对Unicode支持不好,而xpath是xml的一个组成部分,支持Unicode是基本要求。由于xpath语法已经比较完善,个人选择状态机的方式实现词法和语法分析。简单的构架如下:
xpathtoken, 用于从输入的xpath表达式中取出一个token, 可能是一个分隔符,一个节点名,或者一个属性名;
xpathparser, 使用xpathtoken读出每个token,然后将这些token组装成有意义的xpath语法,同时进行语法检查;
xpathdocument, 根据解析出的xpath语法,从一个xml文档中搜索相应的节点;
xpathdocument的实现是xpath路径搜索的难点所在,由于xpathdocument需要根据xpath表达式去遍历xml节点,因此xml parser最好完整实现xml dom level2中关于遍历xml树的功能部分,举例如下:
一个简单的xml 文档结构如下:
<books>
<book>
<title>book1</title>
<author>author1</author>
</book>
<book>
<title>book2</title>
<author>author2</author>
</book>
<books>
然后使用如下xpath表达式://book/title, 目标是搜索所有的book的title.
在xpath解析器解析该xpath表达式并进行搜索的时候,具体的步骤可以做如下分割:
1. 创建一个xpathparser对象,导入xpath表达式//book/title.
2. 创建一个xmldocument对象,导入xml文档
3. 根据xpathparser去遍历xmldocument, 首先xmlparser找到"//book",其意义是找到所有名字叫"book"的节点。可以使用xmldocument的getelementbyname来取得所有的book节点;然后xmlparser找到"/title", 其意义是取得当前结果集下的所有title节点。需要遍历当前结果集,查询其下的title节点。
上叙就是个人在实现一个xpath路径解析器中的细节记录。整体来说,实现xpath路径解析器算是比较容易,而xpath的表达式语言部分就相对复杂多了,个人正在努力中。