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