分类
JDOM / XPATH 编程入门引导攻略‖
| XML是一种优秀的数据 它的大名,那可真是孤陋寡 和机器阅读的双重功效,并 织根据技术领域的需要,制 种流行的程序设计语言都纷 组织开发的XERCES应该是流 型时,并不是针对某一种语 使JAVA程序员在开发XML的 器横空出世,它不遵循DOM 虽然名字差不多,但两者是 以更为高效的开发自己的XM 可,如JBUILDER这样的航空 | 打包和数据交换的形式,在当今 闻了。用XML描述数据的优势显 弥补了关系型数据对客观世界中 定出了XML的格式规范,并相应 纷根据这一模型推出了自己的XM 行最广功能最为强大的XML解析 言而设计,因此为了通用性,加 应用程序过程中感到不甚方便, 模型,建立了自己独立的一套JD 平行的关系),并提供功能强大 L应用程序,并极大的减少了代 母舰级的重磅产品都以JDOM为XM | XML大行于天下,如果没有听说过 而易见,它具有结构简单,便于人 真实数据描述能力的不足。W3C组 的建立了描述模型,简称DOM。各 L解析器,在JAVA世界里,APACHE 器之一。但是由于W3C在设计DOM模 入了许多繁琐而不必要的细节 , 因此JDOM作为一种新型的XML解析 OM模型(注意JDOM决不是DOM扩展, 使用方便的类库,使JAVA程序员可 码量,因此它很快得到了业内的认 L解析引擎,足见其名不虚传。 |
| 有了XML数据的描述标 节点的数据,就像SQL语句 应潮流,应运而生。由于XQ XPATH进行学习,便可以应 入了对XPATH的支持,这无 | 准,人们自然就会想到应该有一 可以在关系性数据库中执行查询 UERY较为复杂,使用不甚方便, 付所有的查询要求。在JDOM发布 疑是令开发者十分激动的。 | 种查询语言可以在XML中查找任意 操作一样,于是XQUERY和XPATH顺 XPATH渐渐成为主流,我们只需对 的最新的V1.0bata10版中,已经加 |
| 学会JDOM和XPATH,你 匕首,为你披荆斩棘,助你 | 便不再是XML的入门者,在未来 勇往直前。闲言少叙,学习还要 | 的开发生涯中,就像特种兵的多用 脚踏实地,从头开始。 |
| XPATH速成篇 |
| XPATH遵循文档对象模型(DOM)的路径 结点的树,每个结点可以是以下七个类型 attribute)、正文(text)、命名空间 instruction)和注释(comment)。XPAT 产生一个对象,这种对象有以下四种基本 XPATH基本上和在文件系统中寻找文件类 是一个绝对路径,这和在UNIX系统中关于 中的任意位置查找。 | 格式,由于每个XML文档都可以看成是一棵拥有许多 之一:根(root)、元素(element)、属性( (namespace)、处理指令(processing H的基本语法由表达式构成。在计算表达式的值之后 类型:节点集合、布尔型、数字型和字符串型 。 似,如果路径是以"/"开头的,就表明该路径表示的 文件路径的定义是一致的。以"//"开头则表示在文档 |
| 不谈泛泛的理论,学习XPATH还要从实例学起最为快捷,并有助于你举一反三。 |
| 下面的样例XML文档,描述了某台电脑中硬盘的基本信息(根节点< HD>代表硬盘,< disk>标签代表硬盘分区,从它的name属性可以看出有两个盘符名称为"C"和"D"的分区;每个分区下都包含< capacity>,< directories>< files>三个节点,分别代表了分区的空间大小、目录数量、所含文件个数): |
| < ?xml version="1.0" encoding="UTF-8"?> |
| < HD> |
| < disk name="C"> |
| < capacity>8G< /capacity> |
| < directories>200< /directories> |
| < files>1580< /files> |
| < /disk> |
| < disk name="D"> |
| < capacity>10G< /capacity> |
| < directories>500< /directories> |
| < files>3000< /files> |
| < /disk> |
| < /HD> |
| 你在XML文档中使用位置路径表达式来查找信息,这些表达式有很多种组成方式。 |
| 结点元素的查找是你将要碰到的最频 含disk结点。你可以使用路径来查找这些 式相匹配的元素。下面的XPATH 语句返回 | 繁的查找方式。在上面这个XML文档例子中,根HD包 结点,用正斜杠(/)来分隔子结点,返回所有与模 所有的disk元素: |
| /HD/disk |
| "*"代表"全部"的意思。/HD/* 代表HD下的全部节点。 |
| 下面的XPATH将返回任意节点下的名称为disk的全部节点: |
| //disk |
| 下面的XPATH将返回名称为disk,name属性为'C'的全部节点: |
| /HD/disk[@name='C'] |
| 节点的附加元素,比如属性,函数等都要用方括号扩起来,属性前面要加上@号 |
| 下面的XPATH将返回文件个数为1580的files节点: |
| /HD/disk/files[text()='1580'] |
| 大家注意到上面包含一 文本。 | 个text(),这就是XPATH的一个 | 函数,它的功能是取出当前节点的 |
| 下面的XPATH将返回文件个数为1580的分区: |
| /HD/disk/files[text()='1580']/parent::* |
| 最后的parent::*表示这个元素的所有的父节点的集合。 |
| XPATH中一些有用的函数: |
![]() |
| XPATH具有丰富的表达功能,上面这 况有许多查询需求,你应该参考本文最后 在这里只起一个抛砖引玉的作用,在下面 些内容,如果你对XPATH感兴趣,应该在 | 些已经基本够用,在你做项目中就会发现根据实际情 提供的W3C发布的关于XAPH的官方资料进行查阅,我 的章节中,我们的应用范例将不会超出上面提到的这 读完本文后,查找相关资料和书籍进行深入学习。 |
| JDOM修炼篇 |
| 用过XERCES的程序员都 实现时,要三四行程序。 | 会感到,有时候用一句话就可以 | 说清楚的事,当用XERCES的API来 |
| 获得并安装JDOM |
| 在http://www.jdom.or 下的全部jar包加入到class | g/ 可以下载JDOM的最新版本, path就可以了。 | 将压缩包中的jdom.jar及lib目录 |
| 用JDOM解析XML |
| JDOM模型的全部类都在 析器,其中的DOMBuilder的 SAXBuilder的功能是从文件 例存储在一个名称为sample 演示了jdom的基本功能,即 | org.jdom.*这个包里,org.jdom 功能是将DOM模型的Document解 或流中解析出符合JDOM模型的XM .xml的文件中,很显然我们应该 解析一个xml文档,并挑选一些 | .input.*这个包里包含了JDOM的解 析成JDOM模型的Document; L树。由于我们的上面提到的XML样 采用后者作为解析工具。下面程序 内容输出到屏幕上。 |
| import java.util.*; |
| import org.jdom.*; |
| import org.jdom.input.SAXBuilder; |
| public class Sample1 { |
| public static void main(String[ | ] args) throws Exception{ |
| SAXBuilder sb=new SAXBuilder(); |
| Document doc=sb.build("sample.xml"); |
| Element root=doc.getRootElement(); |
| List list=root.getChildren("disk"); |
| for(int i=0;i< list.size();i++){ |
| Element element=(Element)list | .get(i); |
| String name=eleme | nt.getAttributeValue("name") | ; |
| String capacity=e | lement.getChildText("capacit | y"); |
| String directories=element.ge | tChildText("directories"); |
| String files=elem | ent.getChildText("files"); |
| System.out.println("磁盘信息:"); |
| System.out.println("分区盘符:"+name); |
| System.out.printl | n("分区容量:"+capacity); |
| System.out.println("目录数:"+ | directories); |
| System.out.println("文件数:"+files); |
| System.out.printl | n("------------------------- | ----------"); |
| } |
| } |
| } |
| 程序的输出结果: |
| 磁盘信息: |
| 分区盘符:C |
| 分区容量:8G |
| 目录数:200 |
| 文件数:1580 |
| ----------------------------------- |
| 磁盘信息: |
| 分区盘符:D |
| 分区容量:10G |
| 目录数:500 |
| 文件数:3000 |
| ----------------------------------- |
| 这段程序采用了传统的解析方式,一 据,中规中矩。试想如果这个树足够深, 呵),那将是一场噩梦!下面的内容将轻 | 级一级的从根节点到子节点逐个采集我们所需要的数 我们想取第5 0层第三个节点的数据(夸张了点,呵 松化解你的这一痛苦。 |
| JDOM+XPATH进阶篇 |
| 说了那么多JDOM和XPATH的好处,终于到了英雄有用武之地的时候了。 |
| JDOM的关于XPATH的api 是如此简洁,什么事都不故 selectNodes()和selectSin xpath语句返回符合条件的 | 在org.jdom.xpath这个包里。看 弄玄虚的搞得那么复杂U飧隼?br>gleNode()。前者根据一个xpath 第一个节点。 | 看这个包下,只有一个类,JDOM就 中的核心的api主要是两个 语句返回一组节点;后者根据一个 |
| 下面的程序我们用JDOM XPATH 的知识: | +XPATH实现了上一个程序同样的 | 功能,你可以从中学到不少运用 |
| import java.util.*; |
| import org.jdom.*; |
| import org.jdom.input.SAXBuilder; |
| import org.jdom.xpath.XPath; |
| public class Sample2 { |
| public static void main(String[ | ] args) throws Exception { |
| SAXBuilder sb = new SAXBuilder(); |
| Document doc = sb. | build("sample.xml"); |
| Element root = doc.getRootElement(); |
| List list = XPath.selectNodes( | root, "/HD/disk"); |
| for (int i = 0; i > list.size(); i++) { |
| Element disk_element = (Eleme | nt) list.get(i); |
| String name = dis | k_element.getAttributeValue( | "name"); |
| String capacity = | ( (Text) XPath.selectSingle | Node(disk_element, |
| "//disk[@name='" + name + "' | ]/capacity/text()")).getTextNormalize(); |
| String directories = ( (Text) | XPath.selectSingleNode(disk_element, |
| "//disk[@name='" | + name + "']/directories/te | xt()")).getTextNormalize(); |
| String files = ( | (Text) XPath.selectSingleNod | e(disk_element, |
| "//disk[@name='" | + name + "']/files/text()") | ).getTextNormalize(); |
| System.out.println("磁盘信息:"); |
| System.out.println("分区盘符:" + name); |
| System.out.printl | n("分区容量:" + capacity); |
| System.out.printl | n("目录数:" + directories); |
| System.out.println("文件数:" + files); |
| System.out.println("--------- | --------------------------"); |
| } |
| } |
| } |
| 输出结果: |
| 磁盘信息: |
| 分区盘符:C |
| 分区容量:8G |
| 目录数:200 |
| 文件数:1580 |
| ----------------------------------- |
| 磁盘信息: |
| 分区盘符:D |
| 分区容量:10G |
| 目录数:500 |
| 文件数:3000 |
| ----------------------------------- |
| 结语 |
| 技术在日新月异的发展 。W3C作为INTERNET方面的 W3C制订的标准,但往往有 多旁门中的一朵奇葩。就像 独家兵器,谁又能说在不久 正在有力的震撼着J2EE中EJ 只要能攻入对方这一弱点, 过这道快餐之后,一定会发 | 。永远没有学过后,便可以一劳 权威组织指导着互联网技术的发 些“旁门左道”的另类功法却能 J2EE大行其道的今天,有许多开 的将来,他们不会成为划时代的 B架构的基石。只要是成型的框 便可在业界站一席之地。本文只 现窗外有更美丽的风景等待我们 | 永逸的技术。XML的发展一日千里 展方向。新技术的出现大都围绕着 产生惊人的杀伤力。JDOM就是这众 源组织仍旧在默默的打造着自己的 创造呢? 君不见Hibernate的兴起 架,必然有薄弱的软肋。新的技术 起抛砖引玉的作用,相信读者在吃 去游历。 |
