日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java中如何引用文档对象模型_在JAVA中使用文档对象模型DOM经验小结

發布時間:2023/12/15 java 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java中如何引用文档对象模型_在JAVA中使用文档对象模型DOM经验小结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文檔對象模型 (DOM) 是一個文檔標準,對于完備的文檔和復雜的應用程序,DOM 提供了大量靈活性。DOM標準是標準的。它很強壯且完整,并且有許多實現。這是許多大型安裝的決定因素--特別是對產品應用程序,以避免在API發生改變時進行大量的改寫。

以上是我在選擇處理XML數據時之所以沒有選擇JDOM或者dom4j等其它面向對象的標準的原因,不過也由于DOM從一開始就是一種與語言無關的模型,而且它更趨向用于像C或Perl這類語言,沒有利用Java的面向對象的性能,所以在使用的過程中也遇到了不少的麻煩,今天這里做一個小結。另外,我目前使用XML主要是作為數據傳輸的統一格式,并統一用戶界面展示的接口,應用的面并不是很廣,所以使用到的DOM的內容其實不多。

在準備使用它的時候,是做了充足的準備的,也有遇到困難的準備,所以一開始就有了一個簡單的工具類來封裝DOM對象使用時必要的公共方法,實際證明這樣做是很明智的,一個簡單的創建Document對象的操作,要是每次都需要寫上5行以上代碼,并且還要處理那些煩人的Exception,實在是會打擊大家的積極性,所以在最初,做了一個XMLTool類,專門封裝了如下的公共方法:

1、?Document對象創建(包括空的Document對象創建,以一個給定Node節點作為根節點創建。

2、?將一個規范的XML字符串轉換成一個Document對象。

3、?從物理硬盤讀取一個XML文件并返回一個Document對象。

4、?將一個Node對象轉換成字符串。

其中每個方法都截獲相關的DOM操作所拋出的異常,轉換成一個RuntimeException拋出,這些異常在實際使用過程中,一般狀況下其實都不會拋出,特別是象生成一個Document對象時的ParserConfigurationException、轉換Node節點成字符串時要生成一個Transformer對象時的TransformerConfigurationException等等,沒有必要在它們身上花時間精力。而且真就出了相關的異常的話,其實根本沒有辦法處理,這樣的狀況通常是系統環境配置有問題(比如必要的DOM實現解析器等包沒有加入環境),所以包裝該異常時只是很簡要的獲取其Message拋出。

代碼如下:

/**

* 初始化一個空Document對象返回。

* @return a Document

*/

public static Document newXMLDocument() {

try {

return newDocumentBuilder().newDocument();

} catch (ParserConfigurationException e) {

throw new RuntimeException(e.getMessage());

}

}

/**

* 初始化一個DocumentBuilder

* @return a DocumentBuilder

* @throws ParserConfigurationException

*/

public static DocumentBuilder newDocumentBuilder()

throws ParserConfigurationException {

return newDocumentBuilderFactory().newDocumentBuilder();

}

/**

* 初始化一個DocumentBuilderFactory

* @return a DocumentBuilderFactory

*/

public static DocumentBuilderFactory newDocumentBuilderFactory() {

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

dbf.setNamespaceAware(true);

return dbf;

}

/**

* 將傳入的一個XML String轉換成一個org.w3c.dom.Document對象返回。

* @param xmlString 一個符合XML規范的字符串表達。

* @return a Document

*/

public static Document parseXMLDocument(String xmlString) {

if (xmlString == null) {

throw new IllegalArgumentException();

}

try {

return newDocumentBuilder().parse(

new InputSource(new StringReader(xmlString)));

} catch (Exception e) {

throw new RuntimeException(e.getMessage());

}

}

/**

* 給定一個輸入流,解析為一個org.w3c.dom.Document對象返回。

* @param input

* @return a org.w3c.dom.Document

*/

public static Document parseXMLDocument(InputStream input) {

if (input == null) {

throw new IllegalArgumentException("參數為null!");

}

try {

return newDocumentBuilder().parse(input);

} catch (Exception e) {

throw new RuntimeException(e.getMessage());

}

}

/**

* 給定一個文件名,獲取該文件并解析為一個org.w3c.dom.Document對象返回。

* @param fileName 待解析文件的文件名

* @return a org.w3c.dom.Document

*/

public static Document loadXMLDocumentFromFile(String fileName) {

if (fileName == null) {

throw new IllegalArgumentException("未指定文件名及其物理路徑!");

}

try {

return newDocumentBuilder().parse(new File(fileName));

} catch (SAXException e) {

throw new IllegalArgumentException(

"目標文件(" + fileName + ")不能被正確解析為XML!\n" + e.getMessage());

} catch (IOException e) {

throw new IllegalArgumentException(

"不能獲取目標文件(" + fileName + ")!\n" + e.getMessage());

} catch (ParserConfigurationException e) {

throw new RuntimeException(e.getMessage());

}

}

/**

* 給定一個節點,將該節點加入新構造的Document中。

* @param node a Document node

* @return a new Document

*/

public static Document newXMLDocument(Node node) {

Document doc = newXMLDocument();

doc.appendChild(doc.importNode(node, true));

return doc;

}

/**

* 將傳入的一個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信息!");

}

/**

* 將傳入的一個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("<?xml version=\"1.0\" encoding=\"gb2312\" ?>");

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("<?xml version=\"1.0\" encoding=\"gb2312\" ?>");

msg.append(

"

+ errMsg

+ "\" 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("<?xml version=\"1.0\" encoding=\"gb2312\" ?>");

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,這個約定雖然使該方法的使用有所限制,也可能導致錯誤使用該方法,但是,按實際使用的狀況來看,這樣的約定和使用方式是沒有問題的,因為實際用到的都是上面舉的例子的狀況,代碼:

/**

* 這個方法獲取給定Node下的Text節點文本信息,如果不存在Text節點則返回null。

* 注意:是直接子節點,相差2層或2層以上不會被考慮。

* @param node a Node 一個Node。

* @return a String 如果給定節點存在Text子節點,則返回第一個訪問到的Text子節點文本信息,如果不存在則返回null。

*/

public static String getNodeValue(Node node) {

if (node == null) {

return null;

}

Text text = getTextNode(node);

if (text != null) {

return text.getNodeValue();

}

return null;

}

/**

* 這個方法獲取給定Node下的Text節點,如果不存在Text節點則返回null。

* 注意:是直接子節點,相差2層或2層以上不會被考慮。

* @param node a Node 一個Node。

* @return a Text 如果給定節點存在Text子節點,則返回第一個訪問到的Text子節點,如果不存在則返回null。

*/

public static Text getTextNode(Node node) {

if (node == null) {

return null;

}

if (node.hasChildNodes()) {

NodeList list = node.getChildNodes();

for (int i = 0; i < list.getLength(); i++) {

if (list.item(i).getNodeType() == Node.TEXT_NODE) {

return (Text) list.item(i);

}

}

}

return null;

}

上面代碼將獲取給定Node節點的直接Text子節點分開包裝。

另一個很經常碰到的狀況是,我希望直接定位到目標節點,獲取該節點對象,而不需要通過一層一層的節點遍歷來找到目標節點,DOM2接口中至少提供了如下的方式來定位節點:

1、?對于Document對象:

1)?getDocumentElement()

總結

以上是生活随笔為你收集整理的Java中如何引用文档对象模型_在JAVA中使用文档对象模型DOM经验小结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人午夜视频免费观看 | 久久久久久久国产精品 | 99精品免费视频 | 亚洲一区二区黄片 | 免费三级网 | 在线成人免费视频 | 四虎福利视频 | 天天曰天天射 | 一本色道久久综合亚洲精品小说 | 精品无码av一区二区三区不卡 | 尹人成人网 | 天堂а在线中文在线新版 | 在线观看日本网站 | 精品一区二区久久久久久按摩 | 欧美午夜视频在线观看 | a∨鲁丝一区鲁丝二区鲁丝三区 | 亚洲涩涩图 | 午夜网站在线观看 | 国产精品jizz在线观看老狼 | 极品女神无套呻吟啪啪 | 国产一级在线观看视频 | 国产精品9191 | 国产精品高潮呻吟久久久久久 | 亚洲天堂av一区二区三区 | 日韩在线观看不卡 | 婷婷国产 | 中文字幕丰满人伦在线 | av在线.com| 青草超碰| 四季av一区二区凹凸精品 | 狠狠爱网站 | 国产日日日| 色资源网站 | xxxxxhd亚洲人hd | 高清av网址 | 欧美福利视频在线观看 | 青青草华人在线视频 | 亚洲系列在线 | 中文字幕免费观看视频 | 无遮挡裸光屁屁打屁股男男 | 国产男女网站 | av免费观看在线 | 日日艹 | 嫩草国产在线 | 日本成人免费观看 | 亚洲精品成人无码 | www.色香蕉 | 婷婷视频一区 | 亚洲少妇15p | 天天插天天射天天干 | 日韩精品色呦呦 | 午夜电影一区二区三区 | 99午夜| 国产欧美日韩三区 | 国产精品免费视频一区二区 | 久久亚洲一区二区三区四区 | 夜夜骑狠狠干 | 亚洲激情在线 | 在线视频 日韩 | 伊人青青久久 | 国产精品久久福利 | 91中文视频 | 成人片黄网站久久久免费 | 欧美成人91 | 在线观看日韩国产 | 网站免费视频www | 亚洲综合在线网 | 天天做天天摸天天爽天天爱 | 国内一级视频 | 一级片免费在线播放 | 最好看的mv中文字幕国语电影 | 欧美黄色片| 草草影院在线观看 | 鲁鲁久久| 亚洲丁香婷婷 | 国产精品无 | 国产毛片毛片毛片毛片毛片毛片 | 牛牛在线| 老司机午夜精品视频 | 香蕉视频2020 | 欧美综合在线视频 | 青青伊人影院 | 99热| 麻豆影视大全 | 成人免费视频国产免费网站 | 亚洲一区二区在线免费 | 色丁香六月 | 奇米第四色首页 | 久久精品999 | 一区精品视频在线观看 | 琪琪免费视频 | xxxx毛片 | 在线播放你懂的 | 中文字幕免费高清 | 不卡的av在线 | 香港一级淫片免费放 | 天天躁日日躁狠狠躁免费麻豆 | 日韩黄色一区二区 | 毛片毛片女人毛片毛片 |