XML第十九讲:JDOM 实现XML的解析

  上一讲我们讲解了JDOM 的一些理论上的内容:JDOM深入详解,现在我们来具体实现一下JDOM是如何解析XML的。

1. 在 JDOM开源的包,可以在 http://www.jdom.org/  中进行下载

2. 将JDOM包 jdom.jar 导入到Eclipse工程中

3.使用JDOM来解析XML过程如下所示:

1)使用JDOM将在内存中构造好的XML结构写到硬盘上

package com.ahuier.jdom;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.xml.stream.XMLOutputFactory;

import org.jdom.Attribute;
import org.jdom.Comment;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

public class JDomTest1 {

    public static void main(String[] args) throws Exception {

        /*
         * 构建XML对象
         */

        // 构建XML的文档
        Document document = new Document();

        // 构建元素,注意这里的Element是普通的元素,如果我们要将其纳入为根元素 用 addContent()方法。
        Element root = new Element("root");

        // 将root添加为根元素
        document.addContent(root);

        // 在root元素中添加注释
        Comment comment = new Comment("This is comments");
        root.addContent(comment);

        // 在root元素下增加子元素hello
        Element e = new Element("hello");
        root.addContent(e);

        // 在元素hello下设置属性-----------------------(1)-------第一种添加属性的方式:在元素e下使用setAttribute()方法
        e.setAttribute("soho", "www.soho.com");

        // 在root元素下增加子元素world-----------------(2)--同时设置第二种添加属性的方式:属性本身也是一个类,new出实例后set到所要设置的元素上即可
        Element e2 = new Element("world");
        Attribute attr = new Attribute("test", "haha");
        e2.setAttribute(attr);
        e.addContent(e2);

        // -------------------------------------(3)-------在 e2 里面添加多个属性,推荐使用这种添加属性的方式
        // new 一个Elment就返回一个Element对象所以直接调用它的setAttribute()方法了。
        // setText()设置元素文本内容
        e2.addContent(new Element("Test").setAttribute("a", "b")
                .setAttribute("x", "y").setAttribute("aa", "gg").setText("This is the conetent"));

        /*
         * 输出xml文档
         */
        // 将XML格式化为优美的XML文档
        Format format = Format.getPrettyFormat();
        //设置缩进四个空格
        format.setIndent("    ");
        
      //  format.setEncoding("gbk"); 设置编码方式为GBK方式,建议不使用,因为默认的编码方式是utf-8是最好的编码方式
        

        // 使用XMLOutputter类中的output()方法来输出xml文档
        XMLOutputter out = new XMLOutputter(format);
        out.output(document, new FileOutputStream("jdom.xml"));

    }

}
[输出的XML文档如下所示]:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <!--This is comments-->
    <hello soho="www.soho.com">
        <world test="haha">
            <Test a="b" x="y" aa="gg">This is the conetent</Test>
        </world>
    </hello>
</root>

[说明]:上诉代码段3所示setAttribute()方法返回的Element,通常我们set方法是不返回值void类型,或者返回的是一个boolean类型,查看JDOM相关的Element,发现里面很多方法set方法都返回Element,这其实涉及到Java语言中的一种编程风格,叫方法链的编程风格(methodchain style)。
  例如下面两个程序表示的方式是不一样的

/*
 * 如果是不返回值,可以这样设置元素的多个属性
 * 每一次set都要写一行
 */
	
	Element e = new Element("Test");
	e.setAttribute("aa", "bb");
	e.setAttribute("cc", "dd");
/*
 * 如果是返回当前的Element对象,可以这样设置属性
 * 它每次都是返回 e 本身,所以可以链锁设置属性
 */
	Element e = new Element("Test");
	e.setAttribute("aa", "bb").setAttribute("cc", "dd");

2. 以上的程序只是联系如何的从内存中构造出来一个XML文档,然后进行输出,现在我们再来练习一个例子,将一个已经存在的XML文档解析出来。

1) 解析下面的XML文档

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <!--This is comments-->
    <hello soho="www.soho.com" test="haha" a="b" x="y" aa="gg">
        <world test="haha">
            <Test a="b" x="y" aa="gg">This is the conetent</Test>
        </world>
    </hello>
</root>

2) 解析过程如下,同时操纵上面的XML节点,并且生成一个新的XML文档如下所示:

package com.ahuier.jdom;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

public class JDomTest2 {

    public static void main(String[] args) throws Exception {

        /*
         * 构造输入类,用户XML文档创建工作,有三种:SAXBuilder 、 DOMBuilder、 ResultSetBuilder
         * 我们选择第一种
         */
        SAXBuilder builder = new SAXBuilder();

        // 加载XML文档
        Document doc = builder.build(new File("jdom.xml"));

        // 创建文档的根元素
        Element element = doc.getRootElement();
        System.out.println(element.getName());

        // 获得root的子元素,指定的元素的第一个子元素
        Element hello = element.getChild("hello");
        System.out.println(hello.getName());
        System.out.println(hello.getText()); // 获得元素内容

        // 取得所有的属性
        List list = hello.getAttributes();
        for (int i = 0; i < list.size(); i++) {
            Attribute attr = (Attribute) list.get(i);

            String attrName = attr.getName();
            String attrValue = attr.getValue();

            System.out.println(attrName + "=" + attrValue);

        }

        // 删除hello的子元素world元素,然后保存为一个新的xml文件
        hello.removeChild("world");

        XMLOutputter out = new XMLOutputter(Format.getPrettyFormat().setIndent(
                "    "));

        out.output(doc, new FileOutputStream("jdom2.xml"));

    }
}
生成的新的XML文档如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <!--This is comments-->
    <hello soho="www.soho.com" test="haha" a="b" x="y" aa="gg" />
</root>



[自此,我们的第一个解析XML的Java框架已经学习完了,下一讲我们讲讲解另外一个Java解析XML框架,DOM4J的用法以及实现方式,敬请关注下一讲内容]





你可能感兴趣的:(java,xml,sax,jdom)