Java中文檔對象模型DOM經驗小結(2 / 3)

*/

public static String toString(Node node) {

if (node == null) {

throw new IllegalArgumentException();

}

Transformer transformer = newTransformer();

if (transformer != null) {

try {

StringWriter sw = new StringWriter();

transformer.transform(new DOMSource(node),

new StreamResult(sw));

return sw.toString();

} catch (TransformerException te) {

throw new RuntimeException(te.getMessage());

}

}

return errXMLString("不能生成XML信息!");

}

/**

* 將傳入的一個DOM Node對象輸出成字符串。如果失敗則返回一個空字符串""。

* @param node DOM Node 對象。

* @return a XML String from node

*/

public static String toString(Node node) {

if (node == null) {

throw new IllegalArgumentException();

}

Transformer transformer = newTransformer();

if (transformer != null) {

try {

StringWriter sw = new StringWriter();

transformer.transform(new DOMSource(node),new StreamResult(sw));

return sw.toString();

} catch (TransformerException te) {

throw new RuntimeException(te.getMessage());

}

}

return errXMLString("不能生成XML信息!");

}

/**

* 獲取一個Transformer對象,由於使用時都做相同的初始化,所以提取出來作為公共方法。

* @return a Transformer encoding gb2312

*/

public static Transformer newTransformer() {

try {

Transformer transformer =TransformerFactory.newInstance().newTransformer();

Properties properties = transformer.getOutputProperties();

properties.setProperty(OutputKeys.ENCODING, "gb2312");

properties.setProperty(OutputKeys.METHOD, "xml");

properties.setProperty(OutputKeys.VERSION, "1.0");

properties.setProperty(OutputKeys.INDENT, "no");

transformer.setOutputProperties(properties);

return transformer;

} catch (TransformerConfigurationException tce) {

throw new RuntimeException(tce.getMessage());

}

}

/**

* 返回一段XML表述的錯誤信息。提示信息的TITLE為:係統錯誤。之所以使用字符串拚裝,主要是這樣做一般

* 不會有異常出現。

* @param errMsg 提示錯誤信息

* @return a XML String show err msg

*/

public static String errXMLString(String errMsg) {

StringBuffer msg = new StringBuffer(100);

msg.append("");

msg.append("");

return msg.toString();

}

/**

* 返回一段XML表述的錯誤信息。提示信息的TITLE為:係統錯誤

* @param errMsg 提示錯誤信息

* @param errClass 拋出該錯誤的類,用於提取錯誤來源信息。

* @return a XML String show err msg

*/

public static String errXMLString(String errMsg, Class errClass) {

StringBuffer msg = new StringBuffer(100);

msg.append("");

msg.append("

+ "\" errSource=\""

+ errClass.getName()

+ "\"/>");

return msg.toString();

}

/**

* 返回一段XML表述的錯誤信息。

* @param title 提示的title

* @param errMsg 提示錯誤信息

* @param errClass 拋出該錯誤的類,用於提取錯誤來源信息。

* @return a XML String show err msg

*/

public static String errXMLString(

String title,

String errMsg,

Class errClass) {

StringBuffer msg = new StringBuffer(100);

msg.append("");

msg.append("

+ title

+ "\" errMsg=\""

+ errMsg

+ "\" errSource=\""

+ errClass.getName()

+ "\"/>");

return msg.toString();

}

以上都是DOM的基本應用,所以就不一一詳細說明了。

在實際使用過程中,有幾種狀況使用很頻繁,但是DOM的接口的設計卻使該操作很麻煩,所以分別添加了相應的處理方法。

其中最麻煩的要數獲取一個節點的Text子節點文本信息了,如下的XML節點:

text

在擁有element節點對象時,要獲取其中的文本信息"text",首先要獲取element節點的子節點列表,要判斷其是否存在子節點,如果存在,那麼遍曆其子節點找到一個TextNode節點,通過getNodeValue()方法來獲取該文本信息,由於這裏element節點沒有信息時沒有子節點,所以必須判斷element節點是否存在子節點才能去訪問真正包含了文本信息的TextNode節點,那麼如果要處理的數據都是以這種形式給出的,就會增加大量的開發代碼同時讓開發工作枯燥無味,因此這裏使用了一個默認的約定實現,就是,給出了一個公共方法,該方法取給定Node下的直接子節點的Text節點文本信息,如果不存在Text節點則返回null,這個約定雖然使該方法的使用有所限製,也可能導致錯誤使用該方法,但是,按實際使用的狀況來看,這樣的約定和使用方式是沒有問題的,因為實際用到的都是上麵舉的例子的狀況,代碼: