分类

  • 软件天地

  • 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的兴起
    架,必然有薄弱的软肋。新的技术
    起抛砖引玉的作用,相信读者在吃
    去游历。

    上一页 下一页




    map