服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

jdom / xpath 编程入门引导攻略


  前言
  xml是一种优秀的数据打包和数据交换的形式,在当今xml大行于天下,如果没有听说过它的大名,那可真是孤陋寡闻了。用xml描述数据的优势显而易见,它具有结构简单,便于人和机器阅读的双重功效,并弥补了关系型数据对客观世界中真实数据描述能力的不足。w3c组织根据技术领域的需要,制定出了xml的格式规范,并相应的建立了描述模型,简称dom。各种流行的程序设计语言都纷纷根据这一模型推出了自己的xml解析器,在java世界里,apache组织开发的xerces应该是流行最广功能最为强大的xml解析器之一。但是由于w3c在设计dom模型时,并不是针对某一种语言而设计,因此为了通用性,加入了许多繁琐而不必要的细节 ,使java程序员在开发xml的应用程序过程中感到不甚方便,因此jdom作为一种新型的xml解析器横空出世,它不遵循dom模型,建立了自己独立的一套jdom模型(注意jdom决不是dom扩展,虽然名字差不多,但两者是平行的关系),并提供功能强大使用方便的类库,使java程序员可以更为高效的开发自己的xml应用程序,并极大的减少了代码量,因此它很快得到了业内的认可,如jbuilder这样的航空母舰级的重磅产品都以jdom为xml解析引擎,足见其名不虚传。
  
  有了xml数据的描述标准,人们自然就会想到应该有一种查询语言可以在xml中查找任意节点的数据,就像sql语句可以在关系性数据库中执行查询操作一样,于是xquery和xpath顺应潮流,应运而生。由于xquery较为复杂,使用不甚方便,xpath渐渐成为主流,我们只需对xpath进行学习,便可以应付所有的查询要求。在jdom发布的最新的v1.0bata10版中,已经加入了对xpath的支持,这无疑是令开发者十分激动的。
  
  学会jdom和xpath,你便不再是xml的入门者,在未来的开发生涯中,就像特种兵的多用匕首,为你披荆斩棘,助你勇往直前。闲言少叙,学习还要脚踏实地,从头开始。
  
  xpath速成篇
  xpath遵循文档对象模型(dom)的路径格式,由于每个xml文档都可以看成是一棵拥有许多结点的树,每个结点可以是以下七个类型之一:根(root)、元素(element)、属性(attribute)、正文(text)、命名空间(namespace)、处理指令(processing instruction)和注释(comment)。xpath的基本语法由表达式构成。在计算表达式的值之后产生一个对象,这种对象有以下四种基本类型:节点集合、布尔型、数字型和字符串型 。xpath基本上和在文件系统中寻找文件类似,如果路径是以"/"开头的,就表明该路径表示的是一个绝对路径,这和在unix系统中关于文件路径的定义是一致的。以"//"开头则表示在文档中的任意位置查找。
  
  不谈泛泛的理论,学习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文档中使用位置路径表达式来查找信息,这些表达式有很多种组成方式。
  
  结点元素的查找是你将要碰到的最频繁的查找方式。在上面这个xml文档例子中,根hd包含disk结点。你可以使用路径来查找这些结点,用正斜杠(/)来分隔子结点,返回所有与模式相匹配的元素。下面的xpath 语句返回所有的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中一些有用的函数:
  
jdom / xpath 编程入门引导攻略

  xpath具有丰富的表达功能,上面这些已经基本够用,在你做项目中就会发现根据实际情况有许多查询需求,你应该参考本文最后提供的w3c发布的关于xaph的官方资料进行查阅,我在这里只起一个抛砖引玉的作用,在下面的章节中,我们的应用范例将不会超出上面提到的这些内容,如果你对xpath感兴趣,应该在读完本文后,查找相关资料和书籍进行深入学习。
  
  jdom修炼篇
  用过xerces的程序员都会感到,有时候用一句话就可以说清楚的事,当用xerces的api来实现时,要三四行程序。
  
  获得并安装jdom
  在http://www.jdom.org/ 可以下载jdom的最新版本,将压缩包中的jdom.jar及lib目录下的全部jar包加入到classpath就可以了。
  
  用jdom解析xml
  jdom模型的全部类都在org.jdom.*这个包里,org.jdom.input.*这个包里包含了jdom的解析器,其中的dombuilder的功能是将dom模型的document解析成jdom模型的document;saxbuilder的功能是从文件或流中解析出符合jdom模型的xml树。由于我们的上面提到的xml样例存储在一个名称为sample.xml的文件中,很显然我们应该采用后者作为解析工具。下面程序演示了jdom的基本功能,即解析一个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=element.getattributevalue("name");
   string capacity=element.getchildtext("capacity");
   string directories=element.getchildtext("directories");
   string files=element.getchildtext("files");
   system.out.println("磁盘信息:");
   system.out.println("分区盘符:"+name);
   system.out.println("分区容量:"+capacity);
   system.out.println("目录数:"+directories);
   system.out.println("文件数:"+files);
   system.out.println("-----------------------------------");
   } 
   }
  }
  
  程序的输出结果:
  
  磁盘信息:
  
  分区盘符:c
  
  分区容量:8g
  
  目录数:200
  
  文件数:1580
  -----------------------------------
  磁盘信息:
  
  分区盘符:d
  
  分区容量:10g
  
  目录数:500
  
  文件数:3000
  -----------------------------------
  这段程序采用了传统的解析方式,一级一级的从根节点到子节点逐个采集我们所需要的数据,中规中矩。试想如果这个树足够深,我们想取第5 0层第三个节点的数据(夸张了点,呵呵),那将是一场噩梦!下面的内容将轻松化解你的这一痛苦。
  
  jdom+xpath进阶篇
  说了那么多jdom和xpath的好处,终于到了英雄有用武之地的时候了。
  
  jdom的关于xpath的api在org.jdom.xpath这个包里。看看这个包下,只有一个类,jdom就是如此简洁,什么事都不故弄玄虚的搞得那么复杂。这个类中的核心的api主要是两个selectnodes()和selectsinglenode()。前者根据一个xpath语句返回一组节点;后者根据一个xpath语句返回符合条件的第一个节点。
  
  下面的程序我们用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 = (element) list.get(i);
   string name = disk_element.getattributevalue("name");
   string capacity = ( (text) xpath.selectsinglenode(disk_ele

扫描关注微信公众号