`
chinagdvea
  • 浏览: 131352 次
  • 性别: Icon_minigender_1
  • 来自: 韶关
社区版块
存档分类
最新评论

JDOM解析XML达到松耦合

阅读更多
原文地址:http://ajava.org/course/xml/14495.html

XML是数据领域的Java语言,它使数据独立于创建它的软件和该软件所在的操作系统,就像Java使软件独立于操作系统一样。

“Jdom makes xml easy”, said by jason hunter.

Jdom是用Java语言读、写、操作XML的新API函数。Jdom是基于树操作的纯Java API,是一套用于解析、创建和实现xml的解决方案。

下载JDOM包:

官网地址:http://www.jdom.org

下载地址(直接在迅雷里新建任务即可):http://www.jdom.org/dist/binary/jdom-1.1.1.zip

配置环境变量:将JDOM目录下的build下的jdom.jar文件,拷贝到JAVA2SKD目录下的jre/lib/ext目录下;使用eclipse时,可手动添加到user liberary。

基本思路:用JDOM读取XML文件,需先用org.jdom.input.SAXBuilder对象的build()方法创建Document对象,然后用Document类(org.jdom.Document)、Element类(org.jdom.Element)等方法读取所需的内容。(后详)

示例:创建一个硬盘上分区磁盘的信息XML文件;读取其中信息,输出到控制台。

基本步骤:

//generateSample.java创建XML

//ReadSample.java 读取XML中信息

一、JDOM创建XML

//GenerateSample.java  
 
package xml;    
  
import java.io.FileOutputStream;   
  
import java.io.IOException;   
  
    
  
import org.jdom.Document;   
  
import org.jdom.Element;   
  
import org.jdom.JDOMException;   
  
import org.jdom.output.Format;   
  
import org.jdom.output.XMLOutputter;   
  
    
  
public class GenerateSample   
  
{   
  
    //创建XML    
  
    public void BuildXMLDoc() throws IOException, JDOMException    
  
    {    
  
       // 创建根节点 root;    
  
       Element root = new Element("HD");    
  
       // 根节点添加到文档中;    
  
       Document Doc = new Document(root);    
  
       // 此处 for 循环可替换成 遍历 数据库表的结果集操作;    
  
    
  
       // 创建节点 DISK1;    
  
       Element elementsC = new Element("disk");    
  
       // 给DISK1 节点添加属性 id;    
  
       elementsC.setAttribute("name", "C");    
  
       // 给DISK1节点添加子节点并赋值;    
  
       elementsC.addContent(new Element("capacity").setText("8G"));    
  
       elementsC.addContent(new Element("directories").setText("200"));    
  
       elementsC.addContent(new Element("files").setText("5000"));    
  
       // 给父节点disk添加disk子节点;    
  
       root.addContent(elementsC);   
  
          
  
       Element elementsD = new Element("disk");    
  
       // 给DISK1 节点添加属性 id;    
  
       elementsD.setAttribute("name", "D");    
  
       // 给DISK1节点添加子节点并赋值;    
  
       elementsD.addContent(new Element("capacity").setText("20G"));    
  
       elementsD.addContent(new Element("directories").setText("400"));    
  
       elementsD.addContent(new Element("files").setText("1520"));    
  
       // 给父节点disk添加disk子节点;    
  
       root.addContent(elementsD);        
  
          
  
       Element elementsE = new Element("disk");    
  
       // 给DISK1 节点添加属性 id;    
  
       elementsE.setAttribute("name", "E");    
  
       // 给DISK1节点添加子节点并赋值;    
  
       elementsE.addContent(new Element("capacity").setText("20G"));    
  
       elementsE.addContent(new Element("directories").setText("500"));    
  
       elementsE.addContent(new Element("files").setText("10200"));    
  
       // 给父节点disk添加disk子节点;    
  
       root.addContent(elementsE);    
  
       
  
       Element elementsF = new Element("disk");    
  
       // 给DISK1 节点添加属性 id;    
  
       elementsF.setAttribute("name", "F");    
  
       // 给DISK1节点添加子节点并赋值;    
  
       elementsF.addContent(new Element("capacity").setText("30G"));    
  
       elementsF.addContent(new Element("directories").setText("700"));    
  
       elementsF.addContent(new Element("files").setText("30000"));    
  
       // 给父节点disk添加disk子节点;    
  
       root.addContent(elementsF);   
  
          
  
       //定义输出    
  
       XMLOutputter XMLOut = new XMLOutputter();    
  
       //设置格式    
  
       Format format = Format.getPrettyFormat();    
  
       format.setEncoding("UTF-8"); //设置xml文件的字符为UTF-8    
  
       format.setIndent(" "); //设置xml文件的缩进为4个空格    
  
       XMLOut.setFormat(format);    
  
       // 输出 user.xml 文件;    
  
       XMLOut.output(Doc, new FileOutputStream("F:/sample.xml"));    
  
    }   
  
    public static void main(String[] args)   
  
    {    
  
       try  
  
       {    
  
           GenerateSample j2x = new GenerateSample();    
  
           j2x.BuildXMLDoc(); //创建    
  
           System.out.println("Sample.xml has already generated successfully!");   
  
       }   
  
       catch (Exception e)    
  
       {    
  
           e.printStackTrace();    
  
       }    
  
    }      
  
}   
  

结果:

①     产生F:\sample.xml文件

②     控制台输出结果:

Sample.xml has already generated successfully!

Sample.xml文件中内容:

<?xml version="1.0" encoding="UTF-8"?>  
  
<HD>  
  
 <disk name="C">  
  
  <capacity>8G</capacity>  
  
  <directories>200</directories>  
  
  <files>5000</files>  
  
 </disk>  
  
 <disk name="D">  
  
  <capacity>20G</capacity>  
  
  <directories>400</directories>  
  
  <files>1520</files>  
  
 </disk>  
  
 <disk name="E">  
  
  <capacity>20G</capacity>  
  
  <directories>500</directories>  
  
  <files>10200</files>  
  
 </disk>  
  
 <disk name="F">  
  
  <capacity>30G</capacity>  
  
  <directories>700</directories>  
  
  <files>30000</files>  
  
 </disk>  
  
</HD>  

 
二、

//ReadSapmle.java

package xml;    
  
import java.util.List;    
  
import org.jdom.Document;   
  
import org.jdom.Element;   
  
import org.jdom.input.SAXBuilder;   
  
    
  
public class ReadSample   
  
{   
  
    public static void main(String[] args) throws Exception   
  
    {   
  
       SAXBuilder sb=new SAXBuilder();   
  
       Document doc=sb.build("F:/sample.xml");//构造文档对象   
  
       Element root=doc.getRootElement();//获得根元素   
  
       List list=root.getChildren("disk");//取标记为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

文件数:5000

---------------------

磁盘信息:

分区盘符:D

分区容量:20G

目录数:400

文件数:1520

---------------------

磁盘信息:

分区盘符:E

分区容量:20G

目录数:500

文件数:10200

---------------------

磁盘信息:

分区盘符:F

分区容量:30G

目录数:700

文件数:30000

---------------------

其他方案对比:

使用XML来表示数据的最大优点之一是,总能将数据取回,如果决定将数据移到关系型数据库、MySQL数据库或其他数据源中,可以很容易地取回这些信息。

①     JAXP(Java API for XML Processing):包括3个软件包org.w3c.dom、org.xml.sax、javax.xml.parsers。使用Java API来读取XML文件中的数据;而使用Java来写入XML数据时,不需要这种API,只需将字符串写入到文件、输出流或者其他介质中,就可以创建XML文件。(复杂,I’m failed in this method!)

②     JDOM,是一种用于与Java对象(而不是XML分析方法)一起来读写和操纵XML的开放源代码库。

③     XOM,开放源代码库,创建它旨在弥补JDOM中明显的缺陷。




基本思路:用JDOM读取XML文件,需先用org.jdom.input.SAXBuilder对象的build()方法创建Document对象,然后用Document类(org.jdom.Document)、Element类(org.jdom.Element)等方法读取所需的内容。


Jdom模型:

每个元素都有四个关键段:名称、元素属性、元素范围名字空间、元素内容

用JDOM处理现有XML文档的大致过程如下:

(1)用简单无变元构造函数构造一个org.jdom.input.SAXBuilder对象。SAXBuilder用sax解析器从文件中构造文档。SAXBuilder侦听sax事件并从内存中建立一个相应的文档。

(2)用SAXBuiler的build()方法从Reader,InputStream,URL,File或包含系统ID的字符串建立Document对象。

(3)如果读取文档遇到问题,则抛出IOException,如果建立文档遇到问题,则抛出JDOMException。

(4)否则用Document类,Element类和其他JDOM类的方法在文档中建立导航。


导航JDOM树

每个Element对象包含一列子元素:Comment,ProcessingInstruction,Text和其他Element对象。此外,属性和其他名字空间还有单独的列表。

分析文档和建立Document对象之后,可能要通过搜索来选择其中程序感兴趣的部分。在JDOM中,大多数导航通过Element类的方法进行。

每个Element的完整子元素(包括了子元素的所有内容,包括说明、处理指令、文本节点和元素,要进行深度搜索,就要对当前元素的子元素应用getContent()方法,通常要采用递归)在getContent()方法返回java.util.List中提供。getChildren()方法返回的java.util.List中只有每个Element的子元素。

JDOM的处理主要是用SAX实现的, JDOM中几乎没有接口,全部是实实在在的类,没有类工厂类的。其最重要的一个包org.jdom中主要有以下类:

Document(文档节点):每个Document对象包括下列三个属性:根Element;表示文档类型声明的DocType对象;包含根元素和任何处理指令与说明的List,按文档顺序出现。

Attribute(属性节点):

Public Element setAttributes (List attributes)Throws IllegalAddException; Public List getAttributes() ;

setAttribute();getAttribute();getAttributeValue();

attribute.getName() ;attribute.getValue()

CDATA (CDATA段节点):
Comment(说明节点) ,即XML文件的说明:<!-- wire configuration -->

DocType (文档类型节点)
Element(元素节点) 元素名设置和获取:

Public Element setName(String name) throws IllegalNameException;Public String getName();

Public String  get(int i)  //i>=0
Content(内容节点)

Public Element setContent(List list) throws IllegalAddException;
public List getContent();  addContent();   removeContent();

EntityRef(实例节点)

Namespace(名字空间节点)

ProcessingInstruction(处理指令节点)

Text(文本节点):getText();setText(String s);
分享到:
评论

相关推荐

    JAVASE做的ATM提款机项目 使用面向对象分层等思想 并使用了jdom

    数据访问层则用于存储和检索用户信息,如通过JDOM解析XML文件来模拟数据库操作。这种分层设计有助于提高代码的可读性和可测试性,同时使得每一层可以独立于其他层进行修改和升级。 JDOM是一个用于处理XML文档的Java...

    模拟Spring的Ioc功能

    本篇文章将详细探讨如何利用jdom2解析XML文档以及通过反射机制来模拟Spring的IoC功能。 首先,理解IoC的基本概念。IoC意味着不再由应用程序直接创建对象,而是由一个容器(如Spring IoC容器)来负责对象的生命周期...

    dom4j(1)

    4. **事件驱动编程**:DOM4J支持SAX事件处理,可以在解析XML时触发事件,实现解耦合的编程模型。 **三、DOM4J基本用法** 1. **解析XML**:使用`DocumentBuilder`创建一个解析器,然后调用`parse()`方法读取XML文件...

    工厂模式的测试并有spring ioc的简单实现

    在测试【springFactoryJDOM】时,可能涉及到Spring对JDOM库的使用,JDOM是Java解析XML文档的一种方式。Spring可以利用其IoC特性来管理解析XML所需的对象,如`DocumentBuilderFactory`和`JDOMBuilder`等,从而简化XML...

    java ssh整合学习

    在Java开发中,JDOM可以帮助解析、创建和修改XML文档。使用JDOM,开发者可以方便地访问XML文档的元素、属性,并进行操作。在SSH框架中,JDOM可能用于配置文件的读取或生成,例如Spring的XML配置文件。 **模拟Spring...

    JAVA 学习各种API

    Spring的IoC容器和AOP是其核心特性,对于理解MVC模式和构建松耦合的应用至关重要。 3. **Hibernate API**: Hibernate是一个对象关系映射(ORM)框架,用于简化Java应用中的数据库操作。Hibernate3.5.1-Final版本...

    spring2.5 学习笔记

    通过Jdom,我们可以动态地构建和解析XML文档,方便地进行对象到XML的转换和XML到对象的绑定。 模拟Spring功能是为了理解Spring的核心机制,如控制反转(IOC)和依赖注入(DI)。在搭建Spring的运行环境中,我们需要...

    spring框架案例学习文档笔记.doc

    在Spring框架中,XML配置文件是声明式配置的主要方式,因此理解JDOM的基本操作对于理解和解析Spring的配置文件至关重要。JDOM允许开发者通过Element、Attribute等对象来构建和操作XML结构。 **第三课:模拟Spring...

    自开发考试系统

    9. **DOM4J**:这是一个用于XML处理的Java库,提供了DOM、SAX和JDOM等多种解析方式。在本系统中,可能用于处理XML配置文件或生成报告。 10. **Commons-HttpClient**:Apache Commons HttpClient是一个HTTP客户端库...

    spring框架学习笔记

    Jdom是Java解析XML文档的一种库,Spring框架在处理配置文件时可能会用到。Jdom提供了方便的API来创建、修改和读取XML文档,使得开发者能更轻松地处理与XML相关的任务。 3. **模拟Spring功能**: 在学习Spring时,...

    最新java,j2ee面试题

    Web Service的核心在于它的松耦合特性,使得不同的应用程序可以通过网络进行通信。 通过以上内容的解析,我们可以看到Java与J2EE面试题涵盖了从基础语法到高级架构设计等多个层面的知识点,对于准备面试的技术人员...

    学习java的30个目标

    XML处理是现代Web服务的关键,你需要学习XML API,如JAXP、JDOM、DOM4J、JAXR,以解析和生成XML文档。 最后,要学习构建Web服务的相关API,如JAX-RPC、SAAJ、JAXB、JAXM、JAXR、JWSDP,以及轻量级应用程序框架,如...

    Java Validation Library-开源

    6. **依赖管理**:在`lib`目录下可能包含了项目运行所需的第三方库,如JDOM,这表明Java Validation Library可能依赖于这些库来解析和处理XML配置文件。 7. `build.xml`文件:这是一个Ant构建脚本,用于自动化构建...

Global site tag (gtag.js) - Google Analytics