Jdom makes xml easy

核心提示:XML 是数据领域的 Java 语言,它使数据独立于创建它的软件和该软件所在的操作系统,就像 Java 使软件独立于操作系统一样。 Jdom makes xml easy , said by jason hunter. Jdom 是用 Java 语言读、写、操作 XML 的新 API 函数。 Jdom 是基于树操作的纯 Java

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

  1. //GenerateSample.java   
  2.   
  3. package xml;    
  4.   
  5. import java.io.FileOutputStream;   
  6.   
  7. import java.io.IOException;   
  8.   
  9.     
  10.   
  11. import org.jdom.Document;   
  12.   
  13. import org.jdom.Element;   
  14.   
  15. import org.jdom.JDOMException;   
  16.   
  17. import org.jdom.output.Format;   
  18.   
  19. import org.jdom.output.XMLOutputter;   
  20.   
  21.     
  22.   
  23. public class GenerateSample   
  24.   
  25. {   
  26.   
  27.     //创建XML    
  28.   
  29.     public void BuildXMLDoc() throws IOException, JDOMException    
  30.   
  31.     {    
  32.   
  33.        // 创建根节点 root;    
  34.   
  35.        Element root = new Element("HD");    
  36.   
  37.        // 根节点添加到文档中;    
  38.   
  39.        Document Doc = new Document(root);    
  40.   
  41.        // 此处 for 循环可替换成 遍历 数据库表的结果集操作;    
  42.   
  43.     
  44.   
  45.        // 创建节点 DISK1;    
  46.   
  47.        Element elementsC = new Element("disk");    
  48.   
  49.        // 给DISK1 节点添加属性 id;    
  50.   
  51.        elementsC.setAttribute("name""C");    
  52.   
  53.        // 给DISK1节点添加子节点并赋值;    
  54.   
  55.        elementsC.addContent(new Element("capacity").setText("8G"));    
  56.   
  57.        elementsC.addContent(new Element("directories").setText("200"));    
  58.   
  59.        elementsC.addContent(new Element("files").setText("5000"));    
  60.   
  61.        // 给父节点disk添加disk子节点;    
  62.   
  63.        root.addContent(elementsC);   
  64.   
  65.           
  66.   
  67.        Element elementsD = new Element("disk");    
  68.   
  69.        // 给DISK1 节点添加属性 id;    
  70.   
  71.        elementsD.setAttribute("name""D");    
  72.   
  73.        // 给DISK1节点添加子节点并赋值;    
  74.   
  75.        elementsD.addContent(new Element("capacity").setText("20G"));    
  76.   
  77.        elementsD.addContent(new Element("directories").setText("400"));    
  78.   
  79.        elementsD.addContent(new Element("files").setText("1520"));    
  80.   
  81.        // 给父节点disk添加disk子节点;    
  82.   
  83.        root.addContent(elementsD);        
  84.   
  85.           
  86.   
  87.        Element elementsE = new Element("disk");    
  88.   
  89.        // 给DISK1 节点添加属性 id;    
  90.   
  91.        elementsE.setAttribute("name""E");    
  92.   
  93.        // 给DISK1节点添加子节点并赋值;    
  94.   
  95.        elementsE.addContent(new Element("capacity").setText("20G"));    
  96.   
  97.        elementsE.addContent(new Element("directories").setText("500"));    
  98.   
  99.        elementsE.addContent(new Element("files").setText("10200"));    
  100.   
  101.        // 给父节点disk添加disk子节点;    
  102.   
  103.        root.addContent(elementsE);    
  104.   
  105.        
  106.   
  107.        Element elementsF = new Element("disk");    
  108.   
  109.        // 给DISK1 节点添加属性 id;    
  110.   
  111.        elementsF.setAttribute("name""F");    
  112.   
  113.        // 给DISK1节点添加子节点并赋值;    
  114.   
  115.        elementsF.addContent(new Element("capacity").setText("30G"));    
  116.   
  117.        elementsF.addContent(new Element("directories").setText("700"));    
  118.   
  119.        elementsF.addContent(new Element("files").setText("30000"));    
  120.   
  121.        // 给父节点disk添加disk子节点;    
  122.   
  123.        root.addContent(elementsF);   
  124.   
  125.           
  126.   
  127.        //定义输出    
  128.   
  129.        XMLOutputter XMLOut = new XMLOutputter();    
  130.   
  131.        //设置格式    
  132.   
  133.        Format format = Format.getPrettyFormat();    
  134.   
  135.        format.setEncoding("UTF-8"); //设置xml文件的字符为UTF-8    
  136.   
  137.        format.setIndent(" "); //设置xml文件的缩进为4个空格    
  138.   
  139.        XMLOut.setFormat(format);    
  140.   
  141.        // 输出 user.xml 文件;    
  142.   
  143.        XMLOut.output(Doc, new FileOutputStream("F:/sample.xml"));    
  144.   
  145.     }   
  146.   
  147.     public static void main(String[] args)   
  148.   
  149.     {    
  150.   
  151.        try  
  152.   
  153.        {    
  154.   
  155.            GenerateSample j2x = new GenerateSample();    
  156.   
  157.            j2x.BuildXMLDoc(); //创建    
  158.   
  159.            System.out.println("Sample.xml has already generated successfully!");   
  160.   
  161.        }   
  162.   
  163.        catch (Exception e)    
  164.   
  165.        {    
  166.   
  167.            e.printStackTrace();    
  168.   
  169.        }    
  170.   
  171.     }      
  172.   
  173. }   
  174.   

结果:

     产生F:/sample.xml文件

     控制台输出结果:

Sample.xml has already generated successfully!

Sample.xml文件中内容:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <HD>  
  4.   
  5.  <disk name="C">  
  6.   
  7.   <capacity>8G</capacity>  
  8.   
  9.   <directories>200</directories>  
  10.   
  11.   <files>5000</files>  
  12.   
  13.  </disk>  
  14.   
  15.  <disk name="D">  
  16.   
  17.   <capacity>20G</capacity>  
  18.   
  19.   <directories>400</directories>  
  20.   
  21.   <files>1520</files>  
  22.   
  23.  </disk>  
  24.   
  25.  <disk name="E">  
  26.   
  27.   <capacity>20G</capacity>  
  28.   
  29.   <directories>500</directories>  
  30.   
  31.   <files>10200</files>  
  32.   
  33.  </disk>  
  34.   
  35.  <disk name="F">  
  36.   
  37.   <capacity>30G</capacity>  
  38.   
  39.   <directories>700</directories>  
  40.   
  41.   <files>30000</files>  
  42.   
  43.  </disk>  
  44.   
  45. </HD>  
  46.   

二、

//ReadSapmle.java

  1. package xml;    
  2.   
  3. import java.util.List;    
  4.   
  5. import org.jdom.Document;   
  6.   
  7. import org.jdom.Element;   
  8.   
  9. import org.jdom.input.SAXBuilder;   
  10.   
  11.     
  12.   
  13. public class ReadSample   
  14.   
  15. {   
  16.   
  17.     public static void main(String[] args) throws Exception   
  18.   
  19.     {   
  20.   
  21.        SAXBuilder sb=new SAXBuilder();   
  22.   
  23.        Document doc=sb.build("F:/sample.xml");//构造文档对象   
  24.   
  25.        Element root=doc.getRootElement();//获得根元素   
  26.   
  27.        List list=root.getChildren("disk");//取标记为disk的所有元素   
  28.   
  29.           
  30.   
  31.        for(int i=0;i<list.size();i++)   
  32.   
  33.        {   
  34.   
  35.            Element element=(Element)list.get(i);   
  36.   
  37.            String name=element.getAttributeValue("name");   
  38.   
  39.            String capacity=element.getChildText("capacity");   
  40.   
  41.            String directories=element.getChildText("directories");   
  42.   
  43.            String files=element.getChildText("files");   
  44.   
  45.            System.out.println("磁盘信息:");   
  46.   
  47.            System.out.println("分区盘符:"+name);   
  48.   
  49.            System.out.println("分区容量:"+capacity);   
  50.   
  51.            System.out.println("目录数:"+directories);   
  52.   
  53.            System.out.println("文件数:"+files);   
  54.   
  55.            System.out.println("---------------------");   
  56.   
  57.        }   
  58.   
  59.     }   
  60.   
  61. }   
  62.   

控制台输出结果:

磁盘信息:

分区盘符:C

分区容量:8G

目录数:200

文件数:5000

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

磁盘信息:

分区盘符:D

分区容量:20G

目录数:400

文件数:1520

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

磁盘信息:

分区盘符:E

分区容量:20G

目录数:500

文件数:10200

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

磁盘信息:

分区盘符:F

分区容量:30G

目录数:700

文件数:30000

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

其他方案对比:

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

     JAXPJava API for XML Processing):包括3个软件包org.w3c.domorg.xml.saxjavax.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对象。SAXBuildersax解析器从文件中构造文档。SAXBuilder侦听sax事件并从内存中建立一个相应的文档。

2)用SAXBuilerbuild()方法从ReaderInputStreamURLFile或包含系统ID的字符串建立Document对象。

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

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

 

导航JDOM

每个Element对象包含一列子元素:CommentProcessingInstructionText和其他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);

JDOM读取XML数据
本文内容搜集于互联网,如有侵犯你的权利,请来信告知。
上一篇: JavaScript实现Json到XML的转换
下一篇: JAVA操作Excel文件

你可能感兴趣的:(java,xml,String,文档,disk,磁盘)