1. 程式人生 > >java基礎71 XML解析中的【DOM和SAX解析工具】相關知識點(網頁知識)

java基礎71 XML解析中的【DOM和SAX解析工具】相關知識點(網頁知識)

本文知識點(目錄):本文下面的“例項及附錄”全是DOM解析的相關內容

1、xml解析的含義

    xml檔案除了給開發者看,更多情況下是使用程式讀取xml檔案中的內容

2、XML的解析方式

    DOM解析
    SAX解析

3、xml的解析工具

3.1、DOM解析工具

    1.JAXP(oracle-Sun公司官方)
    2.JDOM工具(非官方)
    3.Dom4j工具(非官方的)。 三大框架(預設讀取xml的工具就是DOM4j)

3.2、SAX解析工具

    1.Sax解析工具(oracle-Sun公司官方)

4、XML的解析原理

4.1、DOM解析的原理

    xml解析器一次性把整個xml文件載入進記憶體,然後在記憶體中構建一個Document的物件樹,通過document物件,得到樹上的節點物件,通過節點物件訪問(操作)到xml文件的內容.

    缺點:記憶體消耗大
    優點:文件增刪改查比較容易

4.2、SAX解析的原理

    優點:記憶體消耗小,適合讀
    缺點:不適合增刪改

5、例項

例1:

 1 package com.bw.test;
 2 
 3 import org.dom4j.Document;
 4 import org.dom4j.DocumentException;
 5 import org.dom4j.io.SAXReader;
 6 
 7 public class Demo1 {
 8     /*
 9      * 第一個Dom4j讀取xml文件的例子
10      * 
11      * 
*/ 12 public static void main(String[] args) { 13 try { 14 //1.建立一個xml解析器物件 15 SAXReader reader = new SAXReader(); 16 //2.讀取xml文件,返回Document物件 17 Document doc= reader.read("./src/contact.xml"); 18 System.out.println(doc); 19 } catch
(DocumentException e) { 20 // TODO Auto-generated catch block 21 e.printStackTrace(); 22 } 23 } 24 }

contact.xml檔案

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <contactList>
 3     <contact id="001" sex="男">
 4         <name>張三</name>
 5         <age>18</age>
 6         <phone>15779593710</phone>
 7         <email>[email protected]</email>
 8         <qq>872855221</qq>
 9         <abc>
10             <a><b></b></a>
11         </abc>
12     </contact>
13     <contact id="038">
14         <name>李四</name>
15         <age>20</age>
16         <phone>1314580</phone>
17         <email>[email protected]</email>
18         <qq>832144529</qq>
19     </contact>
20 </contactList>

例2:

 1 package com.shore.test;
 2 
 3 import java.io.File;
 4 import java.util.Iterator;
 5 import java.util.List;
 6 
 7 import org.dom4j.Document;
 8 import org.dom4j.DocumentException;
 9 import org.dom4j.Element;
10 import org.dom4j.Node;
11 import org.dom4j.io.SAXReader;
12 import org.junit.Test;
13 
14 /**
15  * @author DSHORE / 2018-8-29
16  *
17  */
18 public class Demo1 {
19     @Test
20     public void test1() throws DocumentException{
21         //1.讀取xml文件,返回一個document物件
22         SAXReader reader=new SAXReader();
23         Document doc=reader.read(new File("./src/contact.xml"));
24         //nodeIterator:得到當前節點下的所有子節點物件(不包含孫以及孫以下的節點)
25         Iterator<Node> it=doc.nodeIterator();
26         while(it.hasNext()){//判斷是否有下一位元素
27             Node node=it.next();
28             System.out.println(node.getName());
29             //繼續獲取下面的子節點
30             //只有標籤有子節點
31             //判斷當前節點是否為標籤節點
32             if(node instanceof Element){
33                 Element elem=(Element)node;
34                 Iterator<Node> it2=elem.nodeIterator();
35                 while(it2.hasNext()){
36                     Node n2=it2.next();
37                     System.out.println(n2.getName());
38                 }    
39             }        
40         }
41     }
42 }

例項結果圖

附錄1

  1 package com.shore.test;
  2 
  3 import java.io.File;
  4 import java.util.Iterator;
  5 import java.util.List;
  6 
  7 import org.dom4j.Attribute;
  8 import org.dom4j.Document;
  9 import org.dom4j.DocumentException;
 10 import org.dom4j.Element;
 11 import org.dom4j.Node;
 12 import org.dom4j.io.SAXReader;
 13 import org.junit.Test;
 14 
 15 /**
 16  * @author DSHORE / 2018-8-29
 17  *
 18  */
 19 /*
 20  * 第二個dom4j讀取的xml檔案內容
 21  * 節點
 22  * 標籤
 23  * 屬性
 24  * 文字
 25  * */
 26 public class Demo1 {
 27     @Test
 28     public void test1() throws DocumentException{
 29         //1.讀取xml文件,返回一個document物件
 30         SAXReader reader=new SAXReader();
 31         Document doc=reader.read(new File("./src/contact.xml"));
 32         //nodeIterator:得到當前節點下的所有子節點物件(不包含孫以及孫以下的節點)
 33         Iterator<Node> it=doc.nodeIterator();
 34         while(it.hasNext()){//判斷是否有下一位元素
 35             Node node=it.next();
 36             System.out.println(node.getName());
 37             //繼續獲取下面的子節點
 38             //只有標籤有子節點
 39             //判斷當前節點是否為標籤節點
 40             if(node instanceof Element){
 41                 Element elem=(Element)node;
 42                 Iterator<Node> it2=elem.nodeIterator();
 43                 while(it2.hasNext()){
 44                     Node n2=it2.next();
 45                     System.out.println(n2.getName());
 46                 }    
 47             }        
 48         }
 49     }
 50     /*
 51      * 遍歷xml檔案的所有節點
 52      * */
 53     @Test
 54     public void test2() throws DocumentException{
 55         //1.讀取xml文件獲取Document物件
 56         SAXReader reader=new SAXReader();
 57         Document doc=reader.read(new File("./src/contact.xml"));
 58         //得到跟標籤
 59         Element rootEls=doc.getRootElement();
 60         getChildNodes(rootEls);
 61     }
 62     /*
 63      * 獲取傳入標籤下的所有子標籤
 64      * */
 65     private void getChildNodes(Element rootEls) {
 66         if(rootEls instanceof Element){
 67             System.out.println(rootEls.getName());
 68         }
 69         //得到子節點
 70         Iterator<Node> it=rootEls.nodeIterator();
 71         while(it.hasNext()){
 72             Node node=it.next();
 73             //判斷是否是標籤節點
 74             if(node instanceof Element){
 75                 Element el=(Element)node;
 76                 //遞迴
 77                 getChildNodes(el);
 78             }
 79         }
 80     }
 81     /*
 82      * 獲取標籤
 83      * */
 84     @Test
 85     public void test3() throws DocumentException{
 86         //1.讀取xml文件,返回Document物件
 87         SAXReader reader=new SAXReader();
 88         Document doc=reader.read(new File("./src/contact.xml"));
 89         //得到跟標籤
 90         Element elt=doc.getRootElement();
 91         //得到標籤名稱
 92         String name=elt.getName();
 93         System.out.println(name);//返回值:contactList
 94         
 95         //方法1:得到當前標籤下指定的名稱的第一個子標籤
 96         Element contactElem=elt.element("contact");
 97         String name1=contactElem.getName();
 98         System.out.println(name1);//返回值:contact
 99         
100         //方法2:得到當前根標籤下的所有下一級子標籤
101         List<Element> list=elt.elements();
102         //遍歷list
103         //1).傳統的for迴圈   2).增強for迴圈  3).迭代器
104         for(int i=0;i<list.size();i++){
105             Element e=list.get(i);
106             System.out.println(e.getName());//返回值:contact   注意:這裡的返回值是有兩個contact,因為contact.xml檔案中有兩個根標籤的下一級標籤contact(兩個contact是同一級)
107         }
108         for (Element e : list) {//增強for迴圈
109             System.out.println(e.getName());//返回值:contact   同上
110         }
111         Iterator<Element> it=list.iterator();
112         while(it.hasNext()){//迭代器
113             Element e=it.next();
114             System.out.println(e.getName());//返回值:contact   同上
115         }
116         
117         //方法3:獲取更深層次標籤(方法只能一層層地獲取)
118         Element element=doc.getRootElement().element("contact").element("name");
119         System.out.println(element.getName());//返回值:name
120     }
121     /*
122      * 獲取屬性值
123      * */
124     @Test
125     public void test4() throws DocumentException{
126         //1.讀取xml文件,返回一個Document物件
127         SAXReader reader=new SAXReader();
128         Document doc=reader.read(new File("./src/contact.xml"));
129         //獲取屬性(先獲取標籤物件,然後在獲取屬性)
130         //獲得標籤物件
131         Element contactElt=doc.getRootElement().element("contact");
132         //獲取屬性,得到指定名稱屬性值
133         String idValue=contactElt.attributeValue("id");
134         System.out.println(idValue);//返回值:001
135         //得到指定屬性名稱的屬性物件
136         Attribute idAttr=contactElt.attribute("id");
137         //getName()屬性名   getValue屬性值
138         System.out.println(idAttr.getName()+"/"+idAttr.getValue());//返回值:id/001
139     }
140 }

結果圖

            

   注:test3()的結果,看程式碼中的註釋

附錄2

 1 package com.shore.test;
 2 
 3 import java.io.File;
 4 import java.util.Iterator;
 5 import java.util.List;
 6 
 7 import org.dom4j.Attribute;
 8 import org.dom4j.Document;
 9 import org.dom4j.DocumentException;
10 import org.dom4j.Element;
11 import org.dom4j.io.SAXReader;
12 import org.junit.Test;
13 /**
14  * @author DSHORE / 2018-8-29
15  *
16  */
17 
18 public class Demo2 {
19     /*
20      * 獲取屬性
21      * */
22     @Test
23     public void test() throws DocumentException{
24         //1.解析xml文件,返回一個document物件
25         Document doc=new SAXReader().read(new File("./src/contact.xml"));
26         //獲取屬性:(先獲取屬性所在標籤物件,然後才能獲取屬性值)
27         //2.得到標籤
28         Element elt=doc.getRootElement().element("contact");
29         //3.得到屬性
30         //得到指定名稱的屬性值
31         String idValue=elt.attributeValue("id");
32         System.out.println(idValue);//返回值:001
33         //得到指定名稱的屬性物件
34         Attribute aib=elt.attribute("id");
35         //getName() 屬性名稱       getValue()屬性值
36         System.out.println("屬性名稱:"+aib.getName()+"/"+"屬性值:"+aib.getValue());//返回值:屬性名稱:id/屬性值:001
37 
38         //方式1:得到所有屬性物件,返回一個list()
39         List<Attribute> list=elt.attributes();
40         for (Attribute attr: list) {
41             System.out.println(attr.getName());//返回值:id/001   sex/男
42         }
43         
44         //方式2:得到所有屬性物件,返回一個迭代器
45         Iterator<Attribute> attr2=elt.attributeIterator();
46         while(attr2.hasNext()){
47             Attribute a=attr2.next();
48             System.out.println(a.getName()+"/"+a.getValue());//返回值:id/001   sex/男
49         }
50     }
51     /*
52      * 獲取文字內容
53      * */
54     @Test
55     public void test2() throws DocumentException{
56         //1.解析xml文件,返回一個document物件
57         Document doc=new SAXReader().read(new File("./src/contact.xml"));
58         /*
59          * 注意:空格和換行也是xml的內容
60          * */
61         String content=doc.getRootElement().getText();
62         //獲取文字內容(先獲取標籤,在獲取標籤上的內容)
63         Element elt=doc.getRootElement().element("contact").element("name");
64         //方式1:得到文字內容
65         String test=elt.getText();
66         System.out.println(test);//返回值:張三
67         
68         //方式2:得到指定標籤的文字內容
69         String test2=doc.getRootElement().element("contact").elementText("phone");
70         System.out.println(test2);    //返回值:15779593710
71     }
72 }

附錄3

contact.xml檔案

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <contactList>
 3     <contact id="001" sex="男">
 4         <name>張三</name>
 5         <age>18</age>
 6         <phone>15779593710</phone>
 7         <email>[email protected]</email>
 8         <qq>872855221</qq>
 9         <abc>
10             <a>  </a>
11         </abc>
12     </contact>
13     <contact id="038">
14         <name>李四</name>
15         <age>20</age>
16         <phone>1314580</phone>
17         <email>[email protected]</email>
18         <qq>832144529</qq>
19     </contact>
20 </contactList>

Contact實體(模型)

 1 package com.shore.test;
 2 
 3 /**
 4  * @author DSHORE / 2018-8-29
 5  *
 6  */
 7 public class Contact {
 8     private String id;
 9     private String name;
10     private String age;
11     private String phone;
12     private String email;
13     private String qq;
14     
15     public String getId() {
16         return id;
17     }
18     public void setId(String id) {
19         this.id = id;
20     }
21     public String getName() {
22         return name;
23     }
24     public void setName(String name) {
25         this.name = name;
26     }
27     public String getAge() {
28         return age;
29     }
30     public void setAge(String age) {
31         this.age = age;
32     }
33     public String getPhone() {
34         return phone;
35     }
36     public void setPhone(String phone) {
37         this.phone = phone;
38     }
39     public String getEmail() {
40         return email;
41     }
42     public void setEmail(String email) {
43         this.email = email;
44     }
45     public String getQq() {
46         return qq;
47     }
48     public void setQq(String qq) {
49         this.qq = qq;
50     }
51     @Override
52     public String toString() {
53         return "Contact [id=" + id + ", name=" + name + ", age=" + age
54                 + ", phone=" + phone + ", email=" + email + ", qq=" + qq + "]";
55     }
56 }

把xml文件中的資訊封裝到物件中

 1 package com.shore.test;
 2 
 3 import java.io.File;
 4 import java.util.ArrayList;
 5 import java.util.Iterator;
 6 import java.util.List;
 7 
 8 import org.dom4j.Document;
 9 import org.dom4j.DocumentException;
10 import org.dom4j.Element;
11 import org.dom4j.io.SAXReader;
12 
13 /**
14  * @author DSHORE / 2018-8-29
15  *
16  */
17 //把xml文件中的資訊封裝到物件中
18 public class Demo3 {
19     public static void main(String[] args) throws DocumentException {
20         List<Contact> list=new ArrayList<Contact>();
21         //讀取xml,封裝物件
22         Document doc=new SAXReader().read(new File("./src/contact.xml"));
23         Iterator<Element> it=doc.getRootElement().elementIterator("contact");
24         while(it.hasNext()){
25             Element elt=it.next();
26             //建立
27             Contact contact=new Contact();
28             contact.setId(elt.attributeValue("id"));
29             contact.setName(elt.elementText("name"));
30             contact.setAge(elt.elementText("age"));
31             contact.setPhone(elt.elementText("phone"));
32             contact.setEmail(elt.elementText("email"));
33             contact.setQq(elt.elementText("qq"));
34             list.add(contact);
35         }
36         for (Contact contact : list) {
37             System.out.println(contact);
38         }
39     } 
40 }

結果圖

相關推薦

java基礎71 XML解析DOMSAX解析工具相關知識點網頁知識

本文知識點(目錄):本文下面的“例項及附錄”全是DOM解析的相關內容 1、xml解析的含義     xml檔案除了給開發者看,更多情況下是使用程式讀取xml檔案中的內容 2、XML的解析方式     DOM解析    SAX解析 3、xml的解析工具 3.1、DOM解析工具     1.JAXP(orac

java基礎74 XML解析SAX解析相關知識點網頁知識

1、SAX解析工具     SAX解析工具:是Sun公司提供的,內建JDK中。org.xml.sax.*         2、SAX解析的核心API SAXParser類:用於讀取和解析xml檔案物件    parse(File f, DefaultHandler dh)方法----->解析xml檔案

java基礎80 JSP基礎知識點網頁知識

1、jsp的引入     Servlet的作用:用java語言開發動態資源技術!!!    Jsp的作用:用java語言(+html語言)開發的動態資源技術!!!     Jsp就是servlet 問題:為什麼jsp就是servlet? 因為:Jsp翻譯成java檔案 public final class

java基礎65 JavaScript網頁知識

str order 幫助 ron target logs .com font tro 1、待續 待續 原創作者:DSHORE 作者主頁:http://www.cnblogs.com/dshore123/ 原文出自:https://www.cnbl

java基礎70 負責靜態的網頁的制作語言XML網頁知識

引號 自定義 交互 ref 特殊 通訊 key alt 如果 HTML:負責網頁結構的CSS:負責網頁的樣式(美觀)JavaScript:負責客戶(瀏覽器)端與用戶進行交互 1、HTML語言的特點 1.由標簽組成 2.語法結構松散 3.大小寫不區分

java基礎73 dom4j修改xml裡面的內容網頁知識

1 package com.shore.code; 2 3 import java.io.File; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 7 import org.dom4j.A

利用DOMSAX解析XML文件

DOM:  (文件物件模型)  --將xml檔案的節點解析成java語言中的物件 優點:可以對整個文件進行增刪改查, 缺點:佔用記憶體相對多【可以根據需要調整JVM的記憶體大小:例如在eclipse中

XML兩種解析思想:DOMSAX

一、什麼是XML 英文全稱為Extensible Markup Language,翻譯過來為可擴充套件標記語言。現實生活中存在著大量的資料,在這些資料之間往往存在一定的關係,我們希望能在計算機中儲存和處理這些資料的同時能夠儲存和處理他們之間的關係。XML就是為

java基礎73 待續網頁知識

bsp 說明 http col tro font -s .cn java基礎 1、待續 待續 原創作者:DSHORE 作者主頁:http://www.cnblogs.com/dshore123/ 原文出自:https://www.cnbl

java基礎74 待續2網頁知識

tps str log strong body cnblogs logs blank targe 1、待續 待續 原創作者:DSHORE 作者主頁:http://www.cnblogs.com/dshore123/ 原文出自:

java基礎75 待續2網頁知識

謝謝 logs borde 幫助 www. targe 轉載 .com http 1、待續 待續 原創作者:DSHORE 作者主頁:http://www.cnblogs.com/dshore123/ 原文出自:https://ww

java基礎81 jsp的內置對象網頁知識

什麽是 basepath 緬甸 exceptio 中文 bili sun公司 ESS pwrite 1、什麽是內置對象? 在jsp開發中,會頻繁使用到一些對象,如:HttpSession,ServletContext,HttpServletRequest。 如

java基礎81 jsp的內建物件網頁知識

1、什麼是內建物件?   在jsp開發中,會頻繁使用到一些物件,如:HttpSession,ServletContext,HttpServletRequest。      如果每次使用這些物件時,都要去建立物件 顯示非常麻煩。所有sun公司就設計jsp時,在jsp頁面載入完畢後會自動幫助開發者建立好這些物件,

java基礎75 xpth技術網頁知識

1、xpth技術 1.1、xpath的作用     主要用於快速獲取所需的節點物件。     list<Node> selectNodes("xpath");  查詢多個節點物件                     selectSingleNode("xpath");  查詢一個節點物件 1.

Java基礎83 待續網頁知識

java 主頁 idt htm href www 轉載 -s width 1、待續 待續 原創作者:DSHORE 作者主頁:http://www.cnblogs.com/dshore123/ 原文出自:https://www.cnblogs.

網絡流24題運輸問題費用流網絡費用流量

size tle 輸出 main pre algorithm 流量 out text 【網絡流24題】運輸問題 2014年3月7日1,6360 題目描述 Description W 公司有m個倉庫和n 個零售商店。第i 個倉庫有ai 個單位的貨物;第j

網絡流24題運輸問題費用流

return 。。 size define max freopen markdown %d true 【網絡流24題】運輸問題(費用流) 題面 Cogs 題解 大水題。。。 源點向倉庫連,容量為貨物量,費用為0 倉庫向商店連,容量INF,費用題目給出來了 商店向匯點連,容量

網絡流24題分配問題費用流

while urn += vector sizeof size line cstring ron 【網絡流24題】分配問題(費用流) 題面 Cogs 題解 這。。。。二分圖最大帶權匹配呀 KM可以直接AC 懶得寫了 一個費用流跑過去了 和運輸問題一毛一樣呀。。。 #incl

Codeforces Round #523(Div. 2)TV Shows貪心+map

題目連結 D. TV Shows time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output The

vue 入坑指南 二 vue路由vue-router

vue 筆記二 v-router構建SPA html路由: <router-link></router-link> //相當於a標籤的作用 跳轉標籤 js路由: this.$router.push({path:'