动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.JAVA哲学 -- 前言.
.使用vector获取页面数值画折线图.
.2004年Java技术发展预测.
.Jbuilder的光标问题.
.怎 样 在 APPLET 中 发 EMAIL.
.corba学习3--idl到java的映射.
.Java模式开发之责任链模式(上).
.创建Web应用和Struts框架的配置文.
.Java的各种架构优缺点分析和展望.
.eval 方法.
..NET应用自动部署窗体技术详解(2).
.javaBean与EJB区别.
.Java 基本语法(五)——控制流程.
.Eclipse快速上手指南 (1).
.一些面向对象的设计法则(4).
.开发NokiaS40系列应用程序初级篇.
.java绘制一个成交量的统计图.
.如何用servlet打开非HTML格式的文.
.使用 Struts 提供的 HTML 标签库.
.最快最省构建漂亮合理的Java程序.

Java实践:用XQuery进行屏幕搜集

发表日期:2008-1-5 |



  上个月,Java 技术讲师 Sam Pullara 向我演示了他最新的支持 Java 的电话 Nokia 6630。这个手机使用了全面的技术 ―― 嵌入式 JVM、GPRS 和蓝牙,但是它也遭遇了所有智能手机都苦恼的问题 ―― 有限的屏幕实际使用区。有些 Web 站点支持基于手机的浏览器,而且嵌入式浏览器也试图在小小的屏幕上有效地渲染页面,但是,在电话屏幕上查看典型的 Web 页面,就像要把一头大象强行塞进车后座一样(其中的每个参与者都会感到失望,包括您、车和大象)。Sam 构建了一个简单的、优雅的解决方案,从他喜欢的 Web 站点上对数据进行屏幕搜集,然后把数据重新格式化,在小屏幕上显示。
  
  新方法
  从 Html 文档提取数据的方法有许多种,但是我真的很喜欢 Sam 采用的方法:既把 XQuery 当作屏幕搜集工具(从页面中提取相当的数据),又把它当作样式表工具(重新格式化数据,以便数据适应页面,不需要进行页面滚动)。只要少量基础设施和一些非常简单的 XQuery 表达式,就可以从大量数据源提取出相关数据 ―― 例如交通、天气和财务报价等,并在电话上完好地显示数据。
  
  我过去经常处于这种情况:对 HTML 页面进行屏幕搜集对某些特定问题来说似乎是可行的方案,但是几乎没有用于屏幕搜集的 Java 工具包。有许多 HTML 解析工具,但它们通常缺少足够的抽象能力(把屏幕搜集代码弄得乱七八糟),大量不符合 HTML 规范的应用限制了它们,它们也无法处理那些结构可能随时间发生变化的、动态生成的页面。
  
  为了弥补质量低下的 HTML 和丰富的 XML 处理工具之间的空白,首先要把 HTML 转换成 XML。许多工具有助于完成这项工作;JTidy 工具包做得很好,可以使这项工作变得轻松一些。JTidy 的设计目标是读入典型质量(即很糟)的 HTML 并输出更整洁的结果(有选项可供选择),它还提供了一个 DOM 接口,用来遍历能够发送给 XML 解析器的 HTML 文档。清单 1 中的代码将从 InputStream 中读取 HTML 文档,并生成文档的 DOM 表示:
  
  清单 1. 用 JTidy 把 HTML 转换成 XML 兼容的 DOM
  
  Tidy tidy = new Tidy();
  tidy.setQuiet(true);
  tidy.setShowWarnings(false);
  Document tidyDOM = tidy.parseDOM(inputStream, null);
  
  用这个简单的转换,就差不多能把每个 Web 页面都当作 XML 文档进行处理,还能用自己喜欢的任何 XML 工具(比如 SAX、XSL、XPath,等等)提取数据。虽然 XSL 可能是很明智的选择(因为其设计目标就是为了从 XML 文档中提取信息并转换这些信息,以便显示它们),但是假如不了解 XSL 的话,它的学习曲线就很难把握,即使是最简单的 XSL 转换也复杂得让人心烦。XPath 是处理信息提取的一个好选择 ―― XSL 和 XQuery 都用它进行内容选择,可以很轻易地使用 XPath 把需要的数据提取出来,然后对 HTML 进行格式化,但是 XQuery 会让这项工具更加轻易。
  
  XQuery:简介
  
  XQuery 的设计目标是从可能非常大的 XML 数据集中提取数据。输入的数据集不必是 XML 文档,虽然它可能是 XML 文档,但是也可能是已经编入索引并保存在 XML 数据库中的文档集合,甚至是一组关系数据库中的表。像 SQL 一样,XQuery 包含从多个数据集中提取数据、汇总数据、聚合数据和连接数据的函数。
  
  就像 jsp、ASP 或 Velocity 这样的表示性模板语言一样,XQuery 把两个域(表示域和计算域)中的元素组合成一种组合语法。结果,所有 XML 文档都自动成为有效的 XQuery 表达式,并对自身进行评估。XQuery 还包含一些语言语句(language statement),例如“for”和“let”,它们可以与 XML 元素混合使用。
  
  清单 2 显示了一个示例 XML 文档 bib.xml,它表示一个书目。然后我们将介绍一些快速的 XQuery 表达式,让您对 XQuery 能够做什么形成一种熟悉,最后我们将再转到屏幕搜集的示例上。要全面介绍 XQuery 的语法和使用情况可能要用几百页的篇幅,有关更具体的参考材料和示例,请参阅 参考资料 小节。
  
  清单 2. 示例 XML 书目
  
  <bib>
  <book year="1994">
    <title>TCP/IP Illustrated</title>
    <author><last>Stevens</last><first>W.</first></author>
    <publisher>Addison-Wesley</publisher>
    <price> 65.95</price>
  </book>
  . . . more books . . .
  </bib>
  
  清单 3 显示了一个 XQuery 表达式,它选择 Addison-Wesley 在 1991 年以后出版的所有书籍,提取它们的标题,并把标题格式化成前面有项目符号的(<ul>)列表。大括号表示从“表示模式”(数据直接传递到输出 ,例如 <ul> 和 <li> 标签)到“代码模式”的切换;然后在 return 子句之后立即进行从“代码模式”到“表示模式”的隐式切换。
  
  清单 3. 根据查询参数选择图书标题的 XQuery 表达式
  
  <ul>
  {
   for $b in doc("bib.xml")/bib/book
   where $b/publisher = "Addison-Wesley" and $b/@year > 1991
   return
  <li>{ data($b/title) }</li>
  }
  </ul>
  
  查询语法引入了“for”,通常称之为“Flower 表达式”(来自 FLWOR,是 for-let-where-order-return 的缩写),该语法从文档中选择一系列 XML 节点,在该例中,用 XPath 选取了来自 bib.xml 文档的 <book> 节点集,然后进一步过滤出与指定查询参数(出版商是 Addison-Wesley,出版日期是 1991 年之后)匹配的节点。对于选出的每个节点,将在 return 子句中计算表达式,在这里是标记(<li> 标签)与代码(提取出每个 <book> 节点的 <title> 元素的内容)的混合。
  
  这个简单的 XQuery 示例描述了 XQuery 的几个方面 ―― 某一文档中表示与代码的混合、XPath 的运用、子条件的运用($b 引用)、非凡的查询表达式、XQuery 函数(data()),还有一个事实:输出文档的结构不必与输入文档的结构匹配。就在这个相当紧凑的、读起来不是很难的查询中,孕育着强大的处理能力。
  
  清单 4 显示了一个更简单的 XQuery 表达式,它把书目中不同出版商的数量,在一个 <count> 元素中输出。像前一个示例一样,它用 XPath 表达式选择一组节点,然后用 XQuery 函数选择惟一值,并计算节点的数量。它通过运算获得一个数字 ―― bib.xml,即文档中不同出版商的数量。
  
  清单 4. 计算不同出版商数量的 XQuery 表达式
  
  <count>
  {
   let $d := distinct-values(doc("bib.xml")/book/publisher)
   return count($d)
  }
  </count>
  
  这些示例只是 XQuery 能够执行的各种查询类型的很少一部分,提供这些例子仅仅是为了让您对使用 XQuery 能够做的事情有些感觉,以及提示您如何才能用 XQuery 把 XML 文档转换成自己选择的格式。虽然 XQuery 的大部分功能主要用于查询大型文档或者其他数据源,但是也可以使用 XQuery 非常简单的子集来对 HTML 文档进行屏幕搜集,为各种应用程序提取出需要的数据,例如在屏幕大小有限的设备(例如蜂窝电话)上显示有关的数据,或者创建一个 DIY 的门户网站,聚集并显示来自多个站点的数据。
  
  用 XQuery 进行屏幕搜集
  
  对 Web 页面做屏幕搜集的许多挑战之一是:它们通常没有可以自我标识的结构,而且它们的结构可能随着站点内容的编辑而变化,甚至有可能根据不同的请求,在页面中插入不同的动态内容(例如广告内容)。因此,对于页面中哪一部分的内容与要提取的数据相对应,通常不得不进行猜测。
  
  股票价格
  
  现在,让我们从提取 Yahoo! 财经页面中 IBM 股票的当前价格开始(http://finance.yahoo.com/q?s=IBM)。这个页面上有许多材料 ―― 新闻标题、广告、财经数据,等等,但是我想要的是股票的价格数据,它放在一个表格单元格中,靠近包含“Last Trade”的单元格。清单 5 中的查询语句将选择所有文本内容中包含“Last Trade”的 <td> 节点,然后为每个节点(希望只有一个)输出一个包含后续<td> 节点内容的表格行。内容是用 return 子句中的 data() 函数提取的;否则,不仅仅会得到 <td> 节点中的文本,还会得到所有的标记。(在这个查询中,惟一包含技巧的部分是 text()[1] 这个部分;在这里,text() 函数匹配的是 <td> 元素中的所有元素 ―― 在这个例子只有一个元素,但 XQuery 并不知道这一点 ―― 所以必须进一步告诉它在进行文本匹配之前,必须选择第一个文本节点)。只要页面包含一个表格单元格的文本是“Last Trade”,而且后续的单元格包含的是股票价格,那么,即使页面的结构随意变化,也不会造成查询失败。
  
  清单 5. 从 Yahoo! 财经提取股票报价的 XQuery 表达式
  
  <table>
  {
   for $d in //td
   where contains($d/text()[1], "Last Trade")
   return <tr><td> { data($d/following-sibling::td) } </td></tr>
  }
  </table>
  
  天气
  
  现在来试一下另外一个页面。Yahoo! 天气页面包含许多 portlet 面板,我想提取上面所列城市的名称、温度和图标。(假如登录 Yahoo! 天气页面 http://weather.yahoo.com,则屏幕上会显示出在“我的 Yahoo!”中所选城市的天气,否则会显示一些主要大城
上一篇:Java基本语法(二)——变量和常量 人气:593
下一篇:诊断Java代码:设计“可测试的”应用程序 人气:397
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-10 企业网站智能管理系统(TZIMS) v6
2008-10-10 拓文asp.net网站内容管理系统 v6
2008-10-10 动网论坛PHP版 v2.0++ Build 081
2008-10-10 免费时代CMS v5.0
2008-10-10 wodig第四季中文DIGG社区 v4.1 b
2008-10-10 老Y文章管理系统 v2.2 bulid 081
2008-10-10 魔法盒动感相册 ASP+SQL版 v2.0
2008-10-10 Asoft签到管理系统 v3.0 Pack1
2008-10-10 哥特人音乐网潮流留言本 v1.1
2008-10-11 联系人分组工具 v1.1 中文破解版
2008-10-11 FaceMelter变脸 v2.0 汉化破解版
2008-10-11 PathTracker道路跟踪仪 v1.2 破解
2008-10-11 Rooms手机聊天室 v0.6.7 破解版
2008-10-11 RemoteDesktop远程桌面 v1.0 破解
2008-10-11 ProRemote远程调音台 v1.0.1 破解
2008-10-11 PicShare照片共享 v1.0.0 破解版
2008-10-11 Photogene照片编辑器 v1.5 汉化破
2008-10-11 WriteRoom共享文档 v1.0 破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号