一套JDOM操作XML文件的Base Class
一,、什么是JDOM?
JDOM是一個開源項目,,它基于樹型結(jié)構(gòu),,利用純Java的技術(shù)對XML文檔實現(xiàn)解析,、生成、序列化以及多種操作,。
利用JDOM處理XML文檔將是一件輕松,、簡單的事。JDOM 在2000年的春天被Brett McLaughlin和Jason Hunter開發(fā)出來,,以彌補DOM及SAX在實際應(yīng)用當(dāng)中的不足之處,。這些不足之處主要在于SAX沒有文檔修改、隨機訪問以及輸出的功能,而對于DOM來說,,JAVA程序員在使用時來用起來總覺得不太方便,。
在2002年的JavaOne會議上JDOM的主要創(chuàng)始人Jason Hunter有一篇精彩的演講介紹了JDOM技術(shù),題目就是JDOM Makes XML Easy,。
JDOM 直接為JAVA編程服務(wù),,它利用更為強有力的JAVA語言的諸多特性(方法重載、集合概念以及映射),,把SAX和DOM的功能有效地結(jié)合起來,。在使用設(shè)計上盡可能地隱藏原來使用XML過程中的復(fù)雜性。DOM的缺點主要是來自于由于Dom是一個接口定義語言(IDL),它的任務(wù)是在不同語言實現(xiàn)中的一個最低的通用標準,,并不是為JAVA特別設(shè)計的,。最近JDOM被收錄到JSR-102內(nèi),這標志著JDOM成為了JAVA平臺組成的一部分,。
二,、Base Class可以實現(xiàn)什么?
在我寫的這個Base Class中,,可以實現(xiàn)創(chuàng)建Document對象,,初始化Element對象,對Element對象進行有條件的修改,、查找操作,,對Document對象進行添加、刪除節(jié)點操作,,讀取,、保存XML文件的操作。這個Base Class是完全通過JDOM來實現(xiàn)操作XML文件,,并對XML文件中的特殊字符進行了過濾,,防止出現(xiàn)無效的XML文件。
三,、Base Class代碼
1. Base Class代碼
/*
* Copyright © 2008 Nervous Organization, All rights reserved. * * LICENSE * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License (GPL) * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * To read the license please visit [url]http://www./copyleft/gpl.html[/url] * */ package org.agricultureonline.common.util; import java.io.File; import java.io.FileWriter; import java.util.List; import org.jdom.*; import org.jdom.input.SAXBuilder; import org.jdom.output.*; /** * @author Steven Wee <a href="mailto:[email protected]">[email protected]</a> * @version $Revision: 1.0 $ $Date: 2008/12/05 23:07:00 $ */ public class BaseXMLOperator { /** * 生成一個新的Document對象 * @return document */ protected Document createDocument() { Document document = new Document(); return document; } /** * 創(chuàng)建一個新的Element對象 * @param paramName Element對象名稱 * @param paramValue Element對象值 * @return element */ protected Element createElement( String paramName, String paramValue) { // 初始化Element Element element = new Element(paramName); // 設(shè)置Element的值,,格式化一遍字符串 element.setText(formatTextForXML(paramValue)); return element; } /** * 向XML文件中增加節(jié)點 * @param document 載入XML文件后獲得的Document對象 * @param fatherElementId 要增加節(jié)點的父節(jié)點Id * @param element 要增加的節(jié)點對象 * @return true-增加節(jié)點成功 false-增加節(jié)點失敗 */ protected boolean addElement( Document document, String fatherElementId, Element element ) { if ( document == null || fatherElementId == null || element == null ) { return false; } // 得到根元素 Element rootElement = document.getRootElement().getChild(fatherElementId); if ( rootElement == null ) { return false; } rootElement.addContent(element); return true; } /** * 修改節(jié)點的屬性值 * @param element 要修改的節(jié)點對象 * @param paramName 要修改的屬性名稱 * @param paramValue 要修改的屬性值 * @return true-修改成功 false-修改失敗 */ protected boolean editElement( Element element, String paramName, String paramValue) { if ( element == null || paramName == null || paramValue == null ) { return false; } Element editElement = element.getChild(paramName); if ( editElement == null ) { return false; } editElement.setText(formatTextForXML(paramValue)); return true; } /** * 修改節(jié)點的屬性值 * @param document 載入XML文件后獲得的Document對象 * @param fatherElementId 父節(jié)點Id * @param elementId 節(jié)點Id * @param Id 要刪除的節(jié)點標示 * @param paramName 要修改的屬性名稱 * @param paramValue 要修改的屬性值 * @return true-修改成功 false-修改失敗 */ protected boolean editElement( Document document, String fatherElementId, String elementId, String Id, String paramName, String paramValue) { return editElement(findElement(document, fatherElementId, elementId, Id), paramName, paramValue); } /** * 從XML文件中刪除節(jié)點 * @param document 載入XML文件后獲得的Document對象 * @param fatherElementId 要刪除節(jié)點的父節(jié)點Id * @param element 要刪除的節(jié)點對象 * @return true-刪除節(jié)點成功 false-刪除節(jié)點失敗 */ protected boolean delElement( Document document, String fatherElementId, Element element ) { // 得到根元素 Element rootElement = document.getRootElement().getChild(fatherElementId); // 刪除節(jié)點 if ( rootElement.removeContent(element) ) { // 刪除成功 return true; } // 刪除失敗 return false; } /** * 從XML文件中刪除節(jié)點 * @param document 載入XML文件后獲得的Document對象 * @param fatherElementId 父節(jié)點Id * @param elementId 節(jié)點Id * @param Id 要刪除的節(jié)點標示 * @return true-刪除節(jié)點成功 false-刪除節(jié)點失敗 */ protected boolean delElement( Document document, String fatherElementId, String elementId, String Id ) { return delElement( document, fatherElementId, findElement(document, fatherElementId, elementId, Id)); } /** * 遍歷Document對象中的所有節(jié)點,查找符合用戶提供的節(jié)點對象 * @param document 載入XML文件后獲得的Document對象 * @param fatherElementId 父節(jié)點Id * @param elementId 節(jié)點Id * @param Id 要查找的節(jié)點標示 * @return element */ @SuppressWarnings("unchecked") protected Element findElement( Document document, String fatherElementId, String elementId, String Id ) { // 節(jié)點標示為空 if ( Id == null ) { return null; } // 得到根元素 Element fatherElement = document.getRootElement().getChild(fatherElementId); // 根元素不存在 if ( fatherElement == null ) { return null; } // 獲得子元素列表 List elementList = fatherElement.getChildren(elementId); // 遍歷列表 for ( int i = 0 ; i < elementList.size() ; i++ ) { // 獲得子元素 Element childElement = ( Element )elementList.get(i); // 比對節(jié)點標示 if ( Id.equalsIgnoreCase(childElement.getAttributeValue("id")) ) { return childElement; } } return null; } /** * 獲取指定節(jié)點對象的值 * @param document 載入XML文件后獲得的Document對象 * @param fatherElementId 父節(jié)點Id * @param elementId 節(jié)點Id * @param Id 要查找的節(jié)點標示 * @param paramName 要獲取的節(jié)點子對象名稱 * @return element */ protected String getElementValue( Document document, String fatherElementId, String elementId, String Id, String paramName ) { return getElementValue(findElement(document, fatherElementId, elementId, Id), paramName); } /** * 獲取指定節(jié)點對象的值 * @param element 節(jié)點對象 * @param paramName 要獲取的節(jié)點子對象名稱 * @return element */ protected String getElementValue( Element element, String paramName ) { if ( paramName == null || element.getChild(paramName) == null ) { return null; } return element.getChild(paramName).getText(); } /** * 從用戶指定的路徑載入XML文件 * @param filePath XML文件路徑 * @return document */ protected Document loadFile( String filePath ) { Document document = null; try { SAXBuilder saxBuilder = new SAXBuilder(); document = saxBuilder.build(new File(filePath)); } catch ( Exception e ) { e.printStackTrace(); return null; } return document; } /** * 保存XML文件到指定的路徑 * @param filePath 指定的XML文件存放路徑 * @param document XML文件的Document對象 * @param encode XML文件編碼,為空代表使用默認的UTF-8編碼 可選編碼包括GB2312/GB18030或者其他 * @return true-保存成功 false-保存失敗 */ protected boolean saveFile( String filePath, Document document, String encode ) { Format format = Format.getCompactFormat(); if ( encode != null ) { format.setEncoding(encode); //設(shè)置xml文件的字符集 } format.setIndent(" "); //設(shè)置xml文件的縮進 try { XMLOutputter xmlOut = new XMLOutputter(format); FileWriter fileWriter = new FileWriter(filePath); // 將XML文件寫入指定路徑 xmlOut.output(document, fileWriter); } catch ( Exception e ) { return false; } return true; } /** * 過濾字符串,,防止XML文件中出現(xiàn)非法字符 * @param sourceString 要過濾的字符串 * @return 過濾后的字符串 */ protected String formatTextForXML( String sourceString ) { if ( sourceString == null ) { return null; } int strLen = 0; StringBuffer reString = new StringBuffer(); String deString = ""; strLen = sourceString.length(); for ( int i = 0 ; i < strLen ; i++ ) { char ch = sourceString.charAt(i); switch ( ch ) { case '<': deString = "<"; break; case '>': deString = ">"; break; case '\"': deString = """; break; case '&': deString = "&"; break; case 13: deString = "\n"; break; default: deString = "" + ch; } reString.append(deString); } return reString.toString(); } } 2. Demo代碼
本段Demo代碼實現(xiàn)了生成一個符合RSS2.0規(guī)范的XML文件
接口定義:
package org.agricultureonline.common.xml;
import org.jdom.*; public interface XMLOperator { public Document initDocument( String title, String linkURL, String description ); public Document loadXMLFile( String filePath ); public Element initElement( String paramName, String paramValue ); public boolean addXMLElement( Document document, Element element ); public boolean editXMLElement( Document document, String Id, String paramName, String paramValue); public boolean delXMLElement( Document document, String Id); public boolean saveDocument( String filePath, Document document ); } 實現(xiàn)類:
package org.agricultureonline.common.xml;
import org.agricultureonline.common.util.BaseXMLOperator; import org.jdom.Document; import org.jdom.Element; public class RSSOperator extends BaseXMLOperator implements XMLOperator { protected String filePath; public RSSOperator() { } public RSSOperator( String filePath) { this.filePath = filePath; } public String getFilePath() { return filePath; } public void setFilePath(String filePath) { this.filePath = filePath; } public Element initElement( String paramName, String paramValue ) { return super.createElement(paramName, paramValue); } public boolean addXMLElement(Document document, Element element) { // TODO Auto-generated method stub return super.addElement(document, "channel", element); } public boolean delXMLElement(Document document, String Id) { // TODO Auto-generated method stub return super.delElement(document, "channel", "item", Id); } public boolean editXMLElement(Document document, String Id, String paramName, String paramValue) { // TODO Auto-generated method stub return super.editElement(document, "channel", "item", Id, paramName, paramValue); } public Document initDocument( String title, String linkURL, String description ) { // TODO Auto-generated method stub Document document = super.createDocument(); Element rssElement = super.createElement("rss", null); rssElement.setAttribute("version", "2.0"); Element channelEelement = new Element("channel"); Element titleElement = new Element("title"); titleElement.setText(title); Element linkElement = new Element("link"); linkElement.setText(super.formatTextForXML(linkURL)); Element descriptionElement = new Element("description"); descriptionElement.setText(super.formatTextForXML(description)); channelEelement.addContent(titleElement); channelEelement.addContent(linkElement); channelEelement.addContent(descriptionElement); rssElement.addContent(channelEelement); document.addContent(rssElement); return document; } public Document loadXMLFile(String filePath) { // TODO Auto-generated method stub return super.loadFile(filePath); } public boolean saveDocument(String filePath, Document document) { // TODO Auto-generated method stub return super.saveFile(filePath, document, "GB18030"); } } 3. 生成的XML文件內(nèi)容
<?xml version="1.0" encoding="GB18030"?>
<rss version="2.0"> <channel> <title>測試XML</title> <link>Link</link> <description>Description</description> <item id="111"> <title>網(wǎng)站RSS訂閱</title> <link>[url]http://www./[/url]</link> <description>農(nóng)業(yè)在線提供了一個中文植物Wiki平臺</description> <pubDate>Wed, 14 Jan 2004 17:16:44 GMT</pubDate> </item> <item id="222"> <title>測試標題</title> <link>http://</link> <description>測試描述</description> <pubDate>Fri Dec 05 18:32:39 CST 2008</pubDate> </item> <item id="333"> <title>測試標題</title> <link>http://</link> <description>測試描述</description> <pubDate>5 Dec 2008 10:33:06 GMT</pubDate> </item> <item id="444"> <title>測試標題</title> <link>http://</link> <description>測試描述</description> <pubDate>5 Dec 2008 10:46:35 GMT</pubDate> </item> </channel> </rss> |
|