国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

java中利用Dom4j解析和生成XML文檔

2019-11-26 13:30:44
字體:
來源:轉載
供稿:網友

一、前言

dom4j是一套非常優秀的Java開源api,主要用于讀寫xml文檔,具有性能優異、功能強大、和非常方便使用的特點。   另外xml經常用于數據交換的載體,像調用webservice傳遞的參數,以及數據做同步操作等等,   所以使用dom4j解析xml是非常有必要的。

二、準備條件

dom4j.jar

下載地址:http://sourceforge.net/projects/dom4j/

三、使用Dom4j實戰

1、解析xml文檔

實現思路:

<1>根據讀取的xml路徑,傳遞給SAXReader之后 返回一個Document文檔對象;

<2>然后操作這個Document對象,獲取下面的節點以及子節點的信息;

具體代碼如下:

import java.io.File; import javaioFileInputStream; import javaioInputStream; import javautilIterator; import javautilList;  import orgdom4jDocument; import orgdom4jDocumentHelper; import orgdom4jElement; import orgdom4jioSAXReader;  /**  * 使用dom4j解析xml文檔  * @author Administrator  *  */ public class Dom4jParseXmlDemo {      public void parseXml01(){     try{       //將src下面的xml轉換為輸入流       InputStream inputStream = new FileInputStream(new File("D:/project/dynamicWeb/src/resource/modulexml"));        //InputStream inputStream = thisgetClass()getResourceAsStream("/modulexml");//也可以根據類的編譯文件相對路徑去找xml       //創建SAXReader讀取器,專門用于讀取xml       SAXReader saxReader = new SAXReader();       //根據saxReader的read重寫方法可知,既可以通過inputStream輸入流來讀取,也可以通過file對象來讀取        //Document document = saxReaderread(inputStream);        Document document = saxReaderread(new File("D:/project/dynamicWeb/src/resource/modulexml"));//必須指定文件的絕對路徑       //另外還可以使用DocumentHelper提供的xml轉換器也是可以的。       //Document document = DocumentHelperparseText("<?xml version=/"0/" encoding=/"UTF-8/"?><modules id=/"123/"><module> 這個是module標簽的文本信息</module></modules>");              //獲取根節點對象       Element rootElement = documentgetRootElement();        Systemoutprintln("根節點名稱:" + rootElementgetName());//獲取節點的名稱       Systemoutprintln("根節點有多少屬性:" + rootElementattributeCount());//獲取節點屬性數目       Systemoutprintln("根節點id屬性的值:" + rootElementattributeValue("id"));//獲取節點的屬性id的值       Systemoutprintln("根節點內文本:" + rootElementgetText());//如果元素有子節點則返回空字符串,否則返回節點內的文本       //rootElementgetText() 之所以會換行是因為 標簽與標簽之間使用了tab鍵和換行符布局,這個也算是文本所以顯示出來換行的效果。       Systemoutprintln("根節點內文本(1):" + rootElementgetTextTrim());//去掉的是標簽與標簽之間的tab鍵和換行符等等,不是內容前后的空格       Systemoutprintln("根節點子節點文本內容:" + rootElementgetStringValue()); //返回當前節點遞歸所有子節點的文本信息。              //獲取子節點       Element element = rootElementelement("module");       if(element != null){         Systemoutprintln("子節點的文本:" + elementgetText());//因為子節點和根節點都是Element對象所以它們的操作方式都是相同的       }       //但是有些情況xml比較復雜,規范不統一,某個節點不存在直接javalangNullPointerException,所以獲取到element對象之后要先判斷一下是否為空              rootElementsetName("root");//支持修改節點名稱       Systemoutprintln("根節點修改之后的名稱:" + rootElementgetName());       rootElementsetText("text"); //同樣修改標簽內的文本也一樣       Systemoutprintln("根節點修改之后的文本:" + rootElementgetText());     } catch (Exception e) {        eprintStackTrace();      }    }      public static void main(String[] args) {     Dom4jParseXmlDemo demo = new Dom4jParseXmlDemo();     demoparseXml01();   } } 

另外上面的xml在src下面,module01.xml具體如下:

<?xml version="0" encoding="UTF-8"?> <modules id="123">   <module> 這個是module標簽的文本信息</module> </modules> 

接下來執行該類的main方法,console效果如下:

由此以知:

<1>dom4j讀取xml文件方式有很多樣;

<2>取出element對象的文本和標簽名稱都非常簡單;

<3>并且修改元素的文本和標簽名稱都非常方便,但是不會寫入到磁盤xml文件中。

上面只是簡單的獲取了xml的根目錄的元素,接下來使用Iterator 迭代器循環document文檔對象。

具體代碼如下:

public void parseXml02(){   try{     //將src下面的xml轉換為輸入流     InputStream inputStream = thisgetClass()getResourceAsStream("/modulexml");     //創建SAXReader讀取器,專門用于讀取xml       SAXReader saxReader = new SAXReader();       //根據saxReader的read重寫方法可知,既可以通過inputStream輸入流來讀取,也可以通過file對象來讀取       Document document = saxReaderread(inputStream);              Element rootElement = documentgetRootElement();     Iterator<Element> modulesIterator = rootElementelements("module")iterator();     //rootElementelement("name");獲取某一個子元素     //rootElementelements("name");獲取根節點下子元素moudule節點的集合,返回List集合類型     //rootElementelements("module")iterator();把返回的list集合里面每一個元素迭代子節點,全部返回到一個Iterator集合中     while(modulesIteratorhasNext()){       Element moduleElement = modulesIteratornext();       Element nameElement = moduleElementelement("name");       Systemoutprintln(nameElementgetName() + ":" + nameElementgetText());       Element valueElement = moduleElementelement("value");       Systemoutprintln(valueElementgetName() + ":" + valueElementgetText());       Element descriptElement = moduleElementelement("descript");       Systemoutprintln(descriptElementgetName() + ":" + descriptElementgetText());     }     } catch (Exception e) {        eprintStackTrace();      }  }  

另外上面的xml在src下面,module02.xml具體如下:

<?xml version="1.0" encoding="UTF-8"?> <modules id="123">   <module>       <name>oa</name>     <value>系統基本配置</value>     <descript>對系統的基本配置根目錄</descript>   </module> </modules> 

接下來執行該類的main方法,console效果如下:

由此以知:

 <1>dom4j迭代xml子元素非常的效率和便捷;

但是上面只是簡單的迭代了xml的子節點元素,但是如果xml規則比較復雜,比如接下來要測試的module03.xml,具體如下:

<?xml version="1.0" encoding="UTF-8"?> <modules id="123">    <module>這個是module標簽的文本信息</module>   <module id="">     <name>oa</name>     <value>系統基本配置</value>     <descript>對系統的基本配置根目錄</descript>     <module>這個是子module標簽的文本信息</module>   </module>    <module>     <name>管理配置</name>     <value>none</value>     <descript>管理配置的說明</descript>     <module id="106">       <name>系統管理</name>       <value>0</value>       <descript>Config</descript>       <module id="107">         <name>部門編號</name>         <value>20394</value>         <descript>編號</descript>       </module>     </module>   </module> </modules> 

因為他們的結構不一樣,直接迭代的話 會報錯:

java.lang.NullPointerException

所以這個時候需要小心使用了,每次都不能把元素直接放進去迭代。具體實現代碼如下:

public void parseXml03(){   try{     //將src下面的xml轉換為輸入流     InputStream inputStream = thisgetClass()getResourceAsStream("/modulexml");     //創建SAXReader讀取器,專門用于讀取xml       SAXReader saxReader = new SAXReader();       //根據saxReader的read重寫方法可知,既可以通過inputStream輸入流來讀取,也可以通過file對象來讀取       Document document = saxReaderread(inputStream);              Element rootElement = documentgetRootElement();       if(rootElementelements("module") != null ){       //因為第一個module標簽只有內容沒有子節點,直接iterator()就javalangNullPointerException了, 所以需要分開實現       List<Element> elementList = rootElementelements("module");       for (Element element : elementList) {         if(!elementgetTextTrim()equals("")){           Systemoutprintln("【1】" + elementgetTextTrim());         }else{           Element nameElement = elementelement("name");           Systemoutprintln("  【2】" + nameElementgetName() + ":" + nameElementgetText());           Element valueElement = elementelement("value");           Systemoutprintln("  【2】" + valueElementgetName() + ":" + valueElementgetText());           Element descriptElement = elementelement("descript");           Systemoutprintln("  【2】" + descriptElementgetName() + ":" + descriptElementgetText());                      List<Element> subElementList = elementelements("module");           for (Element subElement : subElementList) {             if(!subElementgetTextTrim()equals("")){               Systemoutprintln("   【3】" + subElementgetTextTrim());             }else{               Element subnameElement = subElementelement("name");               Systemoutprintln("   【3】" + subnameElementgetName() + ":" + subnameElementgetText());               Element subvalueElement = subElementelement("value");               Systemoutprintln("   【3】" + subvalueElementgetName() + ":" + subvalueElementgetText());               Element subdescriptElement = subElementelement("descript");               Systemoutprintln("   【3】" + subdescriptElementgetName() + ":" + subdescriptElementgetText());             }           }         }       }       }   } catch (Exception e) {        eprintStackTrace();      }  } 

接下來執行該類的main方法,console效果如下:

好了,這下可以解決迭代文檔出現空引用的情況了。

另外代碼其實可以重構一下,因為循環里面取出子元素的操作都是重復的,可以利用遞歸改善,但是可讀性會變差一點。

如果有些時候需要獲取xml中所有的文本信息,又或者別人傳遞的xml格式不規范,比如標簽內名稱大小寫,雖然xml不區分大小寫,但是必須成對出現,所以為了避免這種情況,索性可以將全部的標簽名稱換為大寫,具體代碼如下:

public static void main(String[] args) {   String str = "<?xml version=/"0/" encoding=/"UTF-8/"?><modules id=/"123/"><module> 這個是module標簽的文本信息<name>oa</name><value>系統基本配置</value><descript>對系統的基本配置根目錄</descript></module></modules>";   Systemoutprintln(strreplaceAll("<[^<]*>", "_"));    Pattern pattern = Patterncompile("<[^<]*>");   Matcher matcher = patternmatcher(str);   while(matcherfind()){     str = strreplaceAll(matchergroup(0), matchergroup(0)toUpperCase());   }   Systemoutprintln(str);     } 

運行之后效果圖如下:

2、生成xml文檔

dom4j能夠解析xml,同樣肯定能生成xml,而且使用起來更加簡單方便。

實現思路:

   <1>DocumentHelper提供了創建Document對象的方法;

   <2>操作這個Document對象,添加節點以及節點下的文本、名稱和屬性值;

   <3>然后利用XMLWriter寫入器把封裝的document對象寫入到磁盤中;

具體代碼如下:

import java.io.FileWriter; import javaioIOException; import javaioWriter;  import orgdom4jDocument; import orgdom4jDocumentHelper; import orgdom4jElement; import orgdom4jioXMLWriter;  /**  * 使用dom4j生成xml文檔  * @author Administrator  *  */ public class Dom4jBuildXmlDemo {   public void build01(){     try {       //DocumentHelper提供了創建Document對象的方法       Document document = DocumentHelpercreateDocument();       //添加節點信息       Element rootElement = documentaddElement("modules");       //這里可以繼續添加子節點,也可以指定內容       rootElementsetText("這個是module標簽的文本信息");       Element element = rootElementaddElement("module");              Element nameElement = elementaddElement("name");       Element valueElement = elementaddElement("value");       Element descriptionElement = elementaddElement("description");       nameElementsetText("名稱");       nameElementaddAttribute("language", "java");//為節點添加屬性值       valueElementsetText("值");       valueElementaddAttribute("language", "c#");       descriptionElementsetText("描述");       descriptionElementaddAttribute("language", "sql server");       Systemoutprintln(documentasXML()); //將document文檔對象直接轉換成字符串輸出       Writer fileWriter = new FileWriter("c://modulexml");       //dom4j提供了專門寫入文件的對象XMLWriter       XMLWriter xmlWriter = new XMLWriter(fileWriter);       xmlWriterwrite(document);       xmlWriterflush();       xmlWriterclose();       Systemoutprintln("xml文檔添加成功!");     } catch (IOException e) {       eprintStackTrace();     }   }      public static void main(String[] args) {     Dom4jBuildXmlDemo demo = new Dom4jBuildXmlDemo();     demobuild01();   } } 

運行代碼效果如下:
然后去c盤下面查看是否創建成功,結果發現在xml文件中的內容與控制臺輸出的內容一樣。

另外上面生成xml并沒有指定編碼格式,但是還是顯示了UTF-8,說明這個是默認的編碼格式,如果想重新指定可以在寫入到磁盤之前加上document.setXMLEncoding("GBK");就好了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 吉水县| 德钦县| 株洲县| 定安县| 德惠市| 东乡族自治县| 卢湾区| 枞阳县| 平遥县| 黄龙县| 永靖县| 赞皇县| 吉首市| 梓潼县| 东源县| 盐城市| 海兴县| 四子王旗| 七台河市| 吴桥县| 清河县| 股票| 繁峙县| 慈溪市| 会泽县| 德惠市| 嘉荫县| 资阳市| 莲花县| 南川市| 海兴县| 湖北省| 通许县| 海阳市| 沧州市| 江达县| 古田县| 正宁县| 大理市| 恩施市| 博罗县|