国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術(shù)及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術(shù)|正則表達式|

服務器之家 - 編程語言 - JAVA教程 - java中利用Dom4j解析和生成XML文檔

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

2020-07-08 14:00夜空中苦逼的程序員 JAVA教程

本篇文章主要介紹了java中利用Dom4j解析和生成XML文檔,dom4j是一套非常優(yōu)秀的Java開源api,主要用于讀寫xml文檔,具有性能優(yōu)異、功能強大、和非常方便使用的特點。有興趣的可以了解一下。

一、前言

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

二、準備條件

dom4j.jar

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

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

1、解析xml文檔

實現(xiàn)思路:

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

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

具體代碼如下:

java" id="highlighter_193392">
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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轉(zhuǎn)換為輸入流
      InputStream inputStream = new FileInputStream(new File("D:/project/dynamicWeb/src/resource/modulexml")); 
      //InputStream inputStream = thisgetClass()getResourceAsStream("/modulexml");//也可以根據(jù)類的編譯文件相對路徑去找xml
      //創(chuàng)建SAXReader讀取器,專門用于讀取xml
      SAXReader saxReader = new SAXReader();
      //根據(jù)saxReader的read重寫方法可知,既可以通過inputStream輸入流來讀取,也可以通過file對象來讀取 
      //Document document = saxReaderread(inputStream); 
      Document document = saxReaderread(new File("D:/project/dynamicWeb/src/resource/modulexml"));//必須指定文件的絕對路徑
      //另外還可以使用DocumentHelper提供的xml轉(zhuǎn)換器也是可以的。
      //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é)點屬性數(shù)目
      Systemoutprintln("根節(jié)點id屬性的值:" + rootElementattributeValue("id"));//獲取節(jié)點的屬性id的值
      Systemoutprintln("根節(jié)點內(nèi)文本:" + rootElementgetText());//如果元素有子節(jié)點則返回空字符串,否則返回節(jié)點內(nèi)的文本
      //rootElementgetText() 之所以會換行是因為 標簽與標簽之間使用了tab鍵和換行符布局,這個也算是文本所以顯示出來換行的效果。
      Systemoutprintln("根節(jié)點內(nèi)文本(1):" + rootElementgetTextTrim());//去掉的是標簽與標簽之間的tab鍵和換行符等等,不是內(nèi)容前后的空格
      Systemoutprintln("根節(jié)點子節(jié)點文本內(nèi)容:" + 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"); //同樣修改標簽內(nèi)的文本也一樣
      Systemoutprintln("根節(jié)點修改之后的文本:" + rootElementgetText());
    } catch (Exception e) { 
      eprintStackTrace(); 
    
  }
   
  public static void main(String[] args) {
    Dom4jParseXmlDemo demo = new Dom4jParseXmlDemo();
    demoparseXml01();
  }
}

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

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

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

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

由此以知:

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

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

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

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

具體代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public void parseXml02(){
  try{
    //將src下面的xml轉(zhuǎn)換為輸入流
    InputStream inputStream = thisgetClass()getResourceAsStream("/modulexml");
    //創(chuàng)建SAXReader讀取器,專門用于讀取xml
      SAXReader saxReader = new SAXReader();
      //根據(jù)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具體如下:

?
1
2
3
4
5
6
7
8
<?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效果如下:

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

由此以知:

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?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>

因為他們的結(jié)構(gòu)不一樣,直接迭代的話 會報錯:

java.lang.NullPointerException

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public void parseXml03(){
  try{
    //將src下面的xml轉(zhuǎn)換為輸入流
    InputStream inputStream = thisgetClass()getResourceAsStream("/modulexml");
    //創(chuàng)建SAXReader讀取器,專門用于讀取xml
      SAXReader saxReader = new SAXReader();
      //根據(jù)saxReader的read重寫方法可知,既可以通過inputStream輸入流來讀取,也可以通過file對象來讀取
      Document document = saxReaderread(inputStream);
       
      Element rootElement = documentgetRootElement();
      if(rootElementelements("module") != null ){
      //因為第一個module標簽只有內(nèi)容沒有子節(jié)點,直接iterator()就javalangNullPointerException了, 所以需要分開實現(xiàn)
      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效果如下:

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

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
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);
    
}

運行之后效果圖如下:

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

2、生成xml文檔

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

實現(xiàn)思路:

   <1>DocumentHelper提供了創(chuàng)建Document對象的方法;

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

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

具體代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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é)點,也可以指定內(nèi)容
      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文檔對象直接轉(zhuǎn)換成字符串輸出
      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();
  }
}

運行代碼效果如下:

java中利用Dom4j解析和生成XML文檔
然后去c盤下面查看是否創(chuàng)建成功,結(jié)果發(fā)現(xiàn)在xml文件中的內(nèi)容與控制臺輸出的內(nèi)容一樣。

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

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://blog.csdn.net/chenghui0317/article/details/11486271

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产一区二区黑人欧美xxxx | 国产一区网站 | 欧美日韩精品一区二区三区蜜桃 | 精品在线| 高清视频一区二区三区 | 求av网址 | 自拍偷拍第一页 | 韩国精品一区二区 | 日韩a∨| 91精品视频在线播放 | 一区二区影视 | 亚洲国产精品久久人人爱 | 欧美日韩一区二区三区在线观看 | 亚洲精选一区 | 精品久久久久国产 | 欧美一区二区三区视频在线观看 | www精品美女久久久tv | 久久小视频 | 日本不卡高字幕在线2019 | 在线观看的av| 国产成人av在线播放 | 日韩中文在线视频 | 我要看免费黄色片 | 亚洲欧美日韩一区 | 亚洲黄色成人 | 一区影院 | 中文字幕一区二区三区在线视频 | 999久久久国产999久久久 | 日本妇乱大交xxxxx | 精品福利av导航 | 亚洲精品日韩激情在线电影 | 国产精品一二区 | 久久精品一区二区国产 | 日韩在线观看视频一区二区三区 | 久久综合一区二区 | 岛国免费 | 在线午夜电影 | 欧美日韩视频一区二区 | 欧美亚洲天堂 | 色成人亚洲www78ixcom | www.色小妹.com|