David Dong

David Dong

Java/C/C#/Python

Java/C/C#/Python

POST

Java JDOM 库的使用

最近的开发工作中使用到了JDOM工具包来编辑XML类型的文档。JDOM是一种使用 XML 的Java 工具包。基于 Java 平台并通过 Java 代码来访问、操作并输出 XML 数据。

以下的介绍转载自百度百科, JDOM工具包的下载地址

JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。JDOM 直接为JAVA编程服务。它利用更为强有力的JAVA语言的诸多特性(方法重载、集合概念以及映射),把SAX和DOM的功能有效地结合起来。
Jdom是用Java语言读、写、操作XML的新API函数。Jason Hunter 和 Brett McLaughlin 公开发布了它的1.0版本。在直觉、简单和高效的前提下,这些API函数被最大限度的优化。

XML 类型文档是一个树状结构,因此在创建或者访问是要首先定位到根节点。然后依照分支去搜寻要定位的节点。

以下是我实现的用JDOM 操作XML文档的示列代码。

ServiceXmlInterface.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.dong.service.xml;

/**
 *
 * @author Dong Gang
 */
public interface ServiceXmlInterface {
    public void generateXml(String path,String content);
}

ServiceXml.java 封装XML文档的操作,实现了ServiceXmlInterface 接口。

package org.dong.service.xml;
import org.jdom.Attribute;
import org.jdom.Comment;
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;
import org.openide.util.Exceptions;

public class ServiceXml implements ServiceXmlInterface {

    private static ServiceXml serviceXmlInstance = null;
    private Document doc;
    private Element rootElement;

    private ServiceXml() {
    }
	//单例模式,保证全局唯一句柄
    public static ServiceXml getInstance() {
        if (serviceXmlInstance == null) {
            serviceXmlInstance = new ServiceXml();
        }
        return serviceXmlInstance;
    }

    //读取XML文档
    public void loadConfigurationFile(String path) {

        SAXBuilder builder = new SAXBuilder(false);
        try {
            try {
                InputStreamReader isr = new InputStreamReader(new FileInputStream(path), "gbk");

                try {
                    doc = builder.build(isr);
 					//得到根节点
                    rootElement = doc.getRootElement();
					//得到子节点的列表
                    List<Element> rootList = rootElement.getChildren();
					
                    //以下遍历子节点的内容
                    if (!rootList.isEmpty()) {
                        Element fileList = rootElement.getChild("files-list");
                        List<Element> fileElements = fileList.getChildren();
                        List<String> fileNames = new ArrayList<String>();
                        for (int i = 0; i < fileElements.size(); i++) {
                            Element fileElement = fileElements.get(i);
                            String fileName = fileElement.getAttributeValue("name");
                            fileNames.add(fileName);
                        }
                        ConstantFactory.globalConfStore.setFiles(fileNames);

                        Element uiStyleElement = rootElement.getChild("ui-style");
                        String uiStyle = uiStyleElement.getAttributeValue("name");
                        ConstantFactory.globalConfStore.setUiStyle(uiStyle);

                        Element ruleChk = rootElement.getChild("check-warning");
                        String chkWarningInfo = ruleChk.getAttributeValue("value");
                          
                        ConstantFactory.globalConfStore.setExeWarningChk(chkWarningInfo);

                        Element formatElement = rootElement.getChild("format");
                        String format = formatElement.getAttributeValue("value");
                        ConstantFactory.globalConfStore.setFormat(format);

                        Element recordNumberElement = rootElement.getChild("record-number");
                        String recordNumber = recordNumberElement.getAttributeValue("value");
                        ConstantFactory.globalConfStore.setRecordNumber(recordNumber);

                    } else {
                    }
                } catch (IOException ex) {
                    Logger.getLogger(XMLParser.class.getName()).log(Level.SEVERE, null, ex);
                } catch (JDOMException e) {
                    e.printStackTrace();
                }

            } catch (UnsupportedEncodingException ex) {
                Exceptions.printStackTrace(ex);
            }
        } catch (FileNotFoundException ex) {
            Exceptions.printStackTrace(ex);
        }
    }

}
//生成XML Document 实例,返回值为一个XML Document 类型的对象
public Document generateConfigurationFile(GlobalConfigurationStore gcs) {

        Document doc;
        //生成根节点
        Element rootElement = new Element("global-configuration");
        doc = new Document(rootElement);
        //根节点内容
        rootElement.addContent(new Comment("Global Configuration infomation."));
        Element fileList = new Element("files-list");
        fileList.setAttribute(new Attribute("count", String.valueOf(gcs.getFiles().size())));
        rootElement.addContent(fileList);
        List<String> fileNames = gcs.getFiles();
        //生成子节点
        for (int i = 0; i < fileNames.size(); i++) {
            Element fileElement = new Element("file");
            fileElement.setAttribute(new Attribute("name", fileNames.get(i)));
            fileList.addContent(fileElement);
        }

        Element uiStyleElement = new Element("ui-style");
        String uiStyle = gcs.getUiStyle();
        uiStyleElement.setAttribute(new Attribute("name", uiStyle));
        rootElement.addContent(uiStyleElement);

        Element ruleChk = new Element("check-warning");
        String checkWarning = gcs.getExeWarningChk();
        ruleChk.setAttribute(new Attribute("value", checkWarning));
        rootElement.addContent(ruleChk);

        Element formatElement = new Element("format");
        String format = gcs.getFormat();
        formatElement.setAttribute(new Attribute("value", format));
        rootElement.addContent(formatElement);

        Element recordNumberElement = new Element("record-number");
        String recordNumber = gcs.getRecordNumber();
        recordNumberElement.setAttribute(new Attribute("value", recordNumber));
        rootElement.addContent(recordNumberElement);

        return doc;
    }

//由Document 对象生成一个XML文档
 public void generateXml(String path, Document document) {
        try {
            File testFile = new File(path);
            FileWriter hWriter = new FileWriter(testFile);
            Format format = Format.getPrettyFormat();
            format.setIndent("    ");
            format.setEncoding("gbk");
            //格式化
            XMLOutputter out = new XMLOutputter(format);

            if (!testFile.exists()) {
                testFile.createNewFile();
            } else {
            }
            //输出文件
            out.output(document, hWriter);
            hWriter.close();
        } catch (Exception e) {
            e.getMessage();
        }
    }

如以上代码,使用JDOM解析一个XML文档的步骤如下。

  • 实例化一个合适的解析器对象,本例中我们使用SAXBuilder
SAXBuilder builder = new SAXBuilder(false);
  • 以包含XML数据的文件为参数,构建一个文档对象myDocument
InputStreamReader isr = new InputStreamReader(new FileInputStream(path), "gbk");
Document doc = builder.build(isr);
  • 找到根元素
Element rootElement = doc.getRootElement();

一旦你获取了根元素,你就可以很方便地对它下面的子元素进行操作了,

List<Element> rootList = rootElement.getChildren();

下面对Element对象的一些常用方法作一下简单说明:

方法 说明
getChild 返回指定名字的子节点,如果同一级有多个同名子节点,则只返回第一个,如果没有返回null值。
getChildren 返回指定名字的子节点List集合。这样你就可以遍历所有的同一级同名子节点。
getAttributeValue 返回指定属性名字的值。如果没有该属性则返回null,有该属性但是值为空,则返回空字符串。
getChildText 返回指定子节点的内容文本值。
getText 返回该元素的内容文本值。
setText 修改该元素的内容文本值。
remove 删除第index+1个子元素
removeAll 删除Children的子元素
removeChildren 删除名字为childname的子元素
add 添加Element

Java

相关文章

继续阅读