JDOM解析XML达到松耦合

原文地址:[url]http://ajava.org/course/xml/14495.html[/url]

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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值