欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2016年11月28日 11:39:59   作者:夜空中苦逼的程序員  
本篇文章主要介紹了java中利用Dom4j解析和生成XML文檔,dom4j是一套非常優(yōu)秀的Java開源api,主要用于讀寫xml文檔,具有性能優(yōu)異、功能強大、和非常方便使用的特點。有興趣的可以了解一下。

一、前言

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

二、準備條件

dom4j.jar

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

三、使用Dom4j實戰(zhàn)

1、解析xml文檔

實現思路:

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

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

具體代碼如下:

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 
      //創(chuàng)建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>"); 
       
      //獲取根節(jié)點對象 
      Element rootElement = documentgetRootElement();  
      Systemoutprintln("根節(jié)點名稱:" + rootElementgetName());//獲取節(jié)點的名稱 
      Systemoutprintln("根節(jié)點有多少屬性:" + rootElementattributeCount());//獲取節(jié)點屬性數目 
      Systemoutprintln("根節(jié)點id屬性的值:" + rootElementattributeValue("id"));//獲取節(jié)點的屬性id的值 
      Systemoutprintln("根節(jié)點內文本:" + rootElementgetText());//如果元素有子節(jié)點則返回空字符串,否則返回節(jié)點內的文本 
      //rootElementgetText() 之所以會換行是因為 標簽與標簽之間使用了tab鍵和換行符布局,這個也算是文本所以顯示出來換行的效果。 
      Systemoutprintln("根節(jié)點內文本(1):" + rootElementgetTextTrim());//去掉的是標簽與標簽之間的tab鍵和換行符等等,不是內容前后的空格 
      Systemoutprintln("根節(jié)點子節(jié)點文本內容:" + rootElementgetStringValue()); //返回當前節(jié)點遞歸所有子節(jié)點的文本信息。 
       
      //獲取子節(jié)點 
      Element element = rootElementelement("module"); 
      if(element != null){ 
        Systemoutprintln("子節(jié)點的文本:" + elementgetText());//因為子節(jié)點和根節(jié)點都是Element對象所以它們的操作方式都是相同的 
      } 
      //但是有些情況xml比較復雜,規(guī)范不統(tǒng)一,某個節(jié)點不存在直接javalangNullPointerException,所以獲取到element對象之后要先判斷一下是否為空 
       
      rootElementsetName("root");//支持修改節(jié)點名稱 
      Systemoutprintln("根節(jié)點修改之后的名稱:" + rootElementgetName()); 
      rootElementsetText("text"); //同樣修改標簽內的文本也一樣 
      Systemoutprintln("根節(jié)點修改之后的文本:" + 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> 

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

由此以知:

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

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

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

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

具體代碼如下:

public void parseXml02(){ 
  try{ 
    //將src下面的xml轉換為輸入流 
    InputStream inputStream = thisgetClass()getResourceAsStream("/modulexml"); 
    //創(chuàng)建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");獲取根節(jié)點下子元素moudule節(jié)點的集合,返回List集合類型 
    //rootElementelements("module")iterator();把返回的list集合里面每一個元素迭代子節(jié)點,全部返回到一個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>系統(tǒng)基本配置</value> 
    <descript>對系統(tǒng)的基本配置根目錄</descript> 
  </module> 
</modules> 

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

由此以知:

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

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

<?xml version="1.0" encoding="UTF-8"?> 
<modules id="123"> 
   <module>這個是module標簽的文本信息</module> 
  <module id=""> 
    <name>oa</name> 
    <value>系統(tǒng)基本配置</value> 
    <descript>對系統(tǒng)的基本配置根目錄</descript> 
    <module>這個是子module標簽的文本信息</module> 
  </module> 
   <module> 
    <name>管理配置</name> 
    <value>none</value> 
    <descript>管理配置的說明</descript> 
    <module id="106"> 
      <name>系統(tǒng)管理</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"); 
    //創(chuàng)建SAXReader讀取器,專門用于讀取xml 
      SAXReader saxReader = new SAXReader(); 
      //根據saxReader的read重寫方法可知,既可以通過inputStream輸入流來讀取,也可以通過file對象來讀取 
      Document document = saxReaderread(inputStream); 
       
      Element rootElement = documentgetRootElement(); 
      if(rootElementelements("module") != null ){ 
      //因為第一個module標簽只有內容沒有子節(jié)點,直接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();  
    }  
} 

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

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

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

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

public static void main(String[] args) { 
  String str = "<?xml version=\"0\" encoding=\"UTF-8\"?><modules id=\"123\"><module> 這個是module標簽的文本信息<name>oa</name><value>系統(tǒng)基本配置</value><descript>對系統(tǒng)的基本配置根目錄</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提供了創(chuàng)建Document對象的方法;

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

   <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提供了創(chuàng)建Document對象的方法 
      Document document = DocumentHelpercreateDocument(); 
      //添加節(jié)點信息 
      Element rootElement = documentaddElement("modules"); 
      //這里可以繼續(xù)添加子節(jié)點,也可以指定內容 
      rootElementsetText("這個是module標簽的文本信息"); 
      Element element = rootElementaddElement("module"); 
       
      Element nameElement = elementaddElement("name"); 
      Element valueElement = elementaddElement("value"); 
      Element descriptionElement = elementaddElement("description"); 
      nameElementsetText("名稱"); 
      nameElementaddAttribute("language", "java");//為節(jié)點添加屬性值 
      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盤下面查看是否創(chuàng)建成功,結果發(fā)現在xml文件中的內容與控制臺輸出的內容一樣。

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

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

相關文章

  • java使用枚舉封裝錯誤碼及錯誤信息詳解

    java使用枚舉封裝錯誤碼及錯誤信息詳解

    這篇文章主要介紹了java使用枚舉封裝錯誤碼及錯誤信息,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java的延遲隊列之DelayQueue解讀

    Java的延遲隊列之DelayQueue解讀

    這篇文章主要介紹了Java的延遲隊列之DelayQueue解讀,DelayQueue的底層存儲是一個PriorityQueue,PriorityQueue是一個可排序的Queue,其中的元素必須實現Comparable接口的compareTo方法,需要的朋友可以參考下
    2023-12-12
  • IDEA如何開啟并配置services窗口

    IDEA如何開啟并配置services窗口

    在使用IntelliJ IDEA時,可能會遇到Services窗口不自動彈出的情況,本文介紹了如何手動開啟Services窗口的簡單步驟,首先,通過點擊菜單欄中的“視圖”->“工具窗口”->“服務”,或使用快捷鍵Alt+F8(注意快捷鍵可能存在沖突)來打開Services窗口
    2024-10-10
  • MyBatis入門初體驗之使用大全(2)

    MyBatis入門初體驗之使用大全(2)

    這篇文章主要介紹了MyBatis入門初體驗之使用大全(2)的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • Java使用自定義注解+反射實現字典轉換代碼實例

    Java使用自定義注解+反射實現字典轉換代碼實例

    這篇文章主要介紹了Java使用自定義注解+反射實現字典轉換代碼實例,注解是一種能被添加到java代碼中的元數據,類、方法、變量、參數和包都可以用注解來修飾,注解對于它所修飾的代碼并沒有直接的影響,需要的朋友可以參考下
    2023-09-09
  • 詳解Intellij IDEA 2017 debug斷點調試技巧(總結)

    詳解Intellij IDEA 2017 debug斷點調試技巧(總結)

    這篇文章主要介紹了詳解Intellij IDEA 2017 debug斷點調試技巧(總結),小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • SpringBoot整合gateway全過程

    SpringBoot整合gateway全過程

    這篇文章主要介紹了SpringBoot整合gateway全過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java Servlet線程中AsyncContext異步處理Http請求

    Java Servlet線程中AsyncContext異步處理Http請求

    這篇文章主要介紹了Java Servlet線程中AsyncContext異步處理Http請求及在業(yè)務中應用,AsyncContext是Servlet 3.0使Servlet 線程不再需要一直阻塞,直到業(yè)務處理完畢才能再輸出響應,最后才結束該Servlet線程
    2023-03-03
  • Java使用dom4j實現對xml簡單的增刪改查操作示例

    Java使用dom4j實現對xml簡單的增刪改查操作示例

    這篇文章主要介紹了Java使用dom4j實現對xml簡單的增刪改查操作,結合實例形式詳細分析了Java使用dom4j實現對xml簡單的增刪改查基本操作技巧與相關注意事項,需要的朋友可以參考下
    2020-05-05
  • 基于IOC容器實現管理mybatis過程解析

    基于IOC容器實現管理mybatis過程解析

    這篇文章主要介紹了基于IOC容器實現管理mybatis過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07

最新評論