?
01?Java-DOM4J(DOM4J 開源組織 )-DOM 解析 XML 文件
解析:是用 Java 等相關(guān)技術(shù)將 XML 文件中有用的信息提取
出來的過程叫解析。
解析分為二個大類別
1.?DOM ( Document?Object?Model )類別
一次性將硬盤中的 XML 文件加載的內(nèi)存形成一個倒?fàn)畹臉浣Y(jié)構(gòu),從根開始從上向下依次遍歷,獲取有用節(jié)點的內(nèi)容
2.?SAX(Simple?Api?for?Xml) 類別
分多次將硬盤中的 XML 文件加載的內(nèi)存中,以事件的方式去解析節(jié)點中有用的內(nèi)容
?
目前 :
1.?空間不是問題,問題是時間, 所以 W3C 組織推薦使用 DOM 技術(shù)解析。
?
// 創(chuàng)建 XML 文件,無文件則創(chuàng)建;有文件則覆蓋
Document?xmlDocument?=?DocumentHelper.createDocument();
?
// 將符合條件的字符串轉(zhuǎn)成 XML 文件
Document?xmlDocument?=?DocumentHelper.parseText(str);
?
// 創(chuàng)建 dom4j 核心解析器
SAXReader?saxReader?=?new?SAXReader();
?
// 讀取硬盤中的 xml 文件
Document?xmlDocument?=?saxReader.read(new?File("E:/bookstore.xml"));
?
// 寫出到硬盤文件
XMLWriter?xmlWriter?=?new?XMLWriter(new?FileWriter("E:\\test.xml"));
xmlWriter.write(document);
xmlWriter.close();
?
將 Document 對象寫入 XML 文件?
1. 文檔中全為英文 , 不設(shè)置編碼 , 直接寫入的形式 .??
XMLWriter?writer?=?new?XMLWriter(new??FileWriter("output.xml"));??
writer.write(document);??writer.close();
?
2. 文檔中含有中文 , 設(shè)置編碼格式寫入的形式 .
OutputFormat?format?=?OutputFormat.createPrettyPrint();//? 指定 XML 編碼 ???????????????????
format.setEncoding("GBK");???????
XMLWriter?writer?=?new?XMLWriter(newFileWriter("output.xml"),format);
writer.write(document);writer.close();
?
字符串與 XML 的轉(zhuǎn)換?
1. 將字符串轉(zhuǎn)化為 XML
????? String?text?=?"<members>?<member>sitinspring</member></members>";
? Document?document?=?DocumentHelper.parseText(text);
2. 將文檔或節(jié)點的 XML 轉(zhuǎn)化為字符串 .
?
類加載器 : 我們的所有程序文件,都是由類加載器去讀取硬盤中的內(nèi)容,以流的方式加載到 JVM 中的
類加載器分為不同的類別,如果是讀取我們自已創(chuàng)建的程序文件,始終只是一個類加載器去負(fù)責(zé)讀取
類加載器不會亂去加載,只會去類目錄下加載文件,即在開發(fā)工具的默認(rèn)是 src 目錄下加載
?
?
?
?
02?XPATH 表達(dá)式 (//goods[@id='isbn100'])
XPATH 就是一個字符串,不過這個字符串有其特殊的含義, 利用其特殊含義能快速定位節(jié)點。
使用 XPath 必須導(dǎo)入 jaxen-1.1-beta-6.jar ?,? 在 dom4j 的 lib 文件夾下
和 jaxen-1.1-beta-6.jar
/tv/a/b/c/d 表示從根節(jié)點開始查詢,一直查詢到 d 節(jié)點
?
?
XPATH 使用方法
查詢節(jié)點
獲取所有符合條件的節(jié)點
selectNodes(String?xpathExpression)? 返回 List 集合
獲取符合條件的單個節(jié)點
selectSingleNode(String?xpathExpression)? 返回一個 Node 對象。
如果符合條件的節(jié)點有多個,那么返回第一個。?
?
03?web 入門
做 WEB 應(yīng)用,就是屬于 B/S 軟件結(jié)構(gòu)
所有的客戶端和所有的服務(wù)器要通信,必須采用雙方認(rèn)可的規(guī)則,即 HTTP (超文本傳輸協(xié)議)
?
Web 應(yīng)用的特點
1_ 服務(wù)器響應(yīng)客戶端的是 HTML
2_ 客戶端采用 URL 來定位全世界唯一的資源
3_ 為了便于記憶,不用 IP ,用域名來對 IP 進(jìn)行封裝
4_ 客戶端與服務(wù)器都采用 HTTP 這種應(yīng)用層的協(xié)議,底層是 TCP/IP 協(xié)議
?
web 網(wǎng)站上有二類資源,一類是動態(tài)資源,一類是靜態(tài)資源,
靜態(tài)資源用 html/css 技術(shù)完成,動態(tài)資源用 servlet/jsp/asp/php 技術(shù)完成,
凡是用 java 技術(shù)來開發(fā) web 應(yīng)用中的動態(tài)資源,統(tǒng)稱為 JavaWeb
?
客戶端訪問服務(wù)器,不管服務(wù)器是否有對應(yīng)的資源,服務(wù)器都會給客戶端以響應(yīng),
所以響應(yīng)可分為正確響應(yīng)和錯誤響應(yīng)
?
客戶端使用 URL 來訪問服務(wù)器的資源:以下例如:
http://www.baidu.com:8080/mail/index.html 回車
?
http:// 協(xié)議名稱,這只是 web 中最常用的協(xié)議,例如: https:// , ftp:// ,等等
www.baidu.com 全世界唯一的一個域名,通常一個域名對應(yīng)著一個唯一的 IP 地址
8080 表示服務(wù)器上的一個資源所占用的端口號,通常是不變的, HTTP 協(xié)議默認(rèn)端口號為 80
/mail 表示服務(wù)器上的一個資源的路徑
/index.html 表示服務(wù)器上的一個具體資源名稱
?
學(xué)習(xí) Web 應(yīng)用之前,為什么要用 Web 服務(wù)器呢?
因為如果 Web 服務(wù)器,不能將本地資源讀取出來,并響應(yīng)給遠(yuǎn)程的客戶端,
這時 Web 服務(wù)器相當(dāng)于一個中介,接收客戶端的請求,并做出對應(yīng)的響應(yīng)
我們可以將 Web 服務(wù)器理解為本例的 Demo01 這么一個網(wǎng)絡(luò)應(yīng)用程序
?
什么 JavaEE 規(guī)范?
JavaEE 規(guī)范表示多個具體技術(shù)的統(tǒng)稱,例如: Servlet , Jsp , JavaBean , JDBC , JavaMail ,。。。。
?
04? 常見服務(wù)器簡介
oracle--WebLogic--- 適合于大型應(yīng)用
ibm-----WebSphere--- 適合于大型應(yīng)用
apache---tomcat--- 適合于小型應(yīng)用 --- 開 java 源免費
?
啟動 tomcat 服務(wù)器后,在瀏覽器地址欄輸入如下 URL : http://127.0.0.1:8080 回車
127.0.0.1 是本機 IP 地址
localhost 是本機域名 ,在 tomcat 中默認(rèn)的虛擬主機名字就叫做 localhost
192.168.32.9 局域網(wǎng)中本機 IP 地址
提倡用 127.0.0.1 這個
?
?
05?Tomcat 的安裝,啟動與目錄結(jié)構(gòu)
?
通過瀏覽器訪問的應(yīng)用,我們叫 web 應(yīng)用,
這里說的瀏覽器可以是 PC 瀏覽器,也可以是移動設(shè)備上的瀏覽器
?
所有的 web 資源,都應(yīng)該放在一個目錄下保存,該目錄我們叫 web 應(yīng)用的根目錄,也叫網(wǎng)站的根目錄
?
創(chuàng)建好的 web 應(yīng)用,必須將其根目錄放到 web 服務(wù)器管理,方可被外界訪問,這個過程叫 虛擬目錄的映射
?
06? 在 Tomcat 中設(shè)置虛擬目錄和主機 / 網(wǎng)站 / 站點
<Context?
????????docBase=" 真實 web 應(yīng)用根目錄所有的位置 "?
path=" 以 / 開頭的虛擬目錄名字 "?/>
?
配置虛擬目錄
???修改 tomcat/conf/server.xml 文件
???<Host>
??? <Context?docBase="E:\mail"?path=""?/>
<Context?docBase="E:\mail"?path="/mail"?/>
<Context?docBase="E:\mail"?path="/xx/mail"?/>
<Context?docBase="E:\mail"?path="/xx/yy/mail"?/>
???</Host>
?
?
配置虛擬主機 / 網(wǎng)站,即 tomcat 服務(wù)器中有一個虛擬的 www.baidu.com 網(wǎng)站,目前只能供自己訪問,不能供外界訪問
???修改 tomcat/conf/server.xml 文件
???<Host?name="www.baidu.com"??appBase="E:\">
?????? <Context?docBase="E:\mail"?path=""?/>
<Context?docBase="E:\mail"?path="/mail"?/>
<Context?docBase="E:\mail"?path="/xx/mail"?/>
<Context?docBase="E:\mail"?path="/xx/yy/mail"?/>
???</Host>
???修改 C:\Windows\System32\drivers\etc\Hosts 文件
???#127.0.0.1?????www.baidu.com
???
?
???最終效果:
???http://www.baidu.com:8080/mail/index.html 回車
???http://www.baidu.com:8080/index.html 回車
???http://www.baidu.com/index.html 回車( HTTP 協(xié)議默認(rèn)是 80 ,修改 tomcat 的端口號為 80 )
???http://www.baidu.com/index.html 回車( path="" )
???http://www.baidu.com 回車(默認(rèn)歡迎文件)
?
???www.baidu.com 虛擬主機 / 網(wǎng)站
???/mail 虛擬目錄
?
輸入域名,計算機的解析過程
瀏覽器先去本地找 Hosts 文件,將域名解析成 ip 地址
如果本地找不到,再去 internet 的 dns 服務(wù)器找域名對應(yīng)的 ip 地址
如果本地找到了,不去 internet 找了
07?web 應(yīng)用結(jié)構(gòu)以及在 MyEclipse 中創(chuàng)建 web 應(yīng)用
??????
?
?
?
?
?
?
?
Dom4j? 的重點代碼賞析:
?
?
1.dom4j 基本使用
/**
?*? 演示使用 dom4j 如下內(nèi)容
?*?1 )創(chuàng)建一個新的 xml 文件
?*?2 )將一個符合 xml 文件內(nèi)容的字符串轉(zhuǎn)成 xml 文件
?*?3 )加載已存在的 xml 文件到內(nèi)存,形成一個倒?fàn)畹臉浣Y(jié)構(gòu),根就是 Document 對象
?*/
?
/**
?*?? 創(chuàng)建一個新的 xml 文件
?*/
public?static?void?type01()?throws?Exception?{
// 創(chuàng)建一個內(nèi)存對象 Document ,它就表示硬盤中 xml 文件
Document?xmlDocument?=?DocumentHelper.createDocument();
// 將內(nèi)存中的對象 Document 寫入到硬盤中,形成一個 xml 文件
XMLWriter?xmlWriter?=?new?XMLWriter(new?FileOutputStream(new?File("E:/new.xml")));
xmlWriter.write(xmlDocument);
xmlWriter.close();
}
?
/**
?*? 將一個符合 xml 文件內(nèi)容的字符串轉(zhuǎn)成 xml 文件
?*/
public?static?void?type02()?throws?Exception?{
// 創(chuàng)建符合 xml 內(nèi)容的字符串
String?str?=?"<root><city> 廣州 </city></root>";
// 將字符串轉(zhuǎn)成 document 對象
Document?xmlDocument?=?DocumentHelper.parseText(str);
// 將內(nèi)存中的 document 對象輸出到硬盤,形成一個 xml 文件
XMLWriter?xmlWriter?=?new?XMLWriter(new?FileOutputStream(new?File("E:/new.xml")));
xmlWriter.write(xmlDocument);
xmlWriter.close();
}
?
/**
?*? 加載已存在的 xml 文件到內(nèi)存,形成一個倒?fàn)畹臉浣Y(jié)構(gòu),根就是 Document 對象
?*/
public?static?void?type03()?throws?Exception?{
// 創(chuàng)建 dom4j 核心解析器
SAXReader?saxReader?=?new?SAXReader();
// 讀取硬盤中的 xml 文件
Document?xmlDocument?=?saxReader.read(new?File("E:/bookstore.xml"));
// 判斷是否已讀取到 xml 文件
System.out.println(xmlDocument!=null?" 已讀取 xml 文件 ":" 未讀取 xml 文件 ");
}
?
?
?
/**
?*? 使用 dom4j 解析器
?*?1 )獲取根節(jié)點的名字?
?*?2 )獲取根節(jié)點下的直接子節(jié)點的個數(shù)
?*/
public?class?Demo02?{
public?static?void?main(String[]?args)?throws?Exception{
// 創(chuàng)建 dom4j 解析器對象
SAXReader?saxReader?=?new?SAXReader();
// 創(chuàng)建 InputStream 對象,指向硬盤的 xml 文件
InputStream?is?=?new?FileInputStream(new?File("E:\\bookstore.xml"));
// 通過字節(jié)流,加載硬盤中的 xml 文件到內(nèi)存
Document?xmlDocument?=?saxReader.read(is);
// 獲取根節(jié)點
Element?rootElement?=?xmlDocument.getRootElement();
// 顯示根節(jié)點的名字
System.out.println(rootElement.getName());
// 獲取根節(jié)點下的直接子節(jié)點的個數(shù)和名字
List<Element>?list?=?rootElement.elements("book");
System.out.println(" 根節(jié)點下有 "+list.size()+" 直接子節(jié)點 ");
}
}
?
?
/**
?*? 使用 dom4j 解析器
?*?1 )解析所有 book 節(jié)點屬性值
?*?2 )解析所有 book 節(jié)點下子節(jié)點中的內(nèi)容
?*/
public?class?Demo03?{
public?static?void?main(String[]?args)?throws?Exception{
// 創(chuàng)建 dom4j 解析器對象
SAXReader?saxReader?=?new?SAXReader();
// 創(chuàng)建 InputStream 對象,指向硬盤的 xml 文件
InputStream?is?=?new?FileInputStream(new?File("E:\\bookstore.xml"));
// 通過字節(jié)流,加載硬盤中的 xml 文件到內(nèi)存
Document?xmlDocument?=?saxReader.read(is);
// 獲取根節(jié)點
Element?rootElement?=?xmlDocument.getRootElement();
// 獲取根節(jié)點下所有 book 子節(jié)點所形成的集合
List<Element>?list?=?rootElement.elements("book");
// 迭代
for(Element?element?:?list){
// 獲取 book 節(jié)點的 id 屬性值
String?id?=?element.attributeValue("id");
// 分別獲取 book 節(jié)點的 title/auth/price 子節(jié)點的內(nèi)容
String?title?=?element.element("title").getText().trim();
String?auth?=?element.element("auth").getText().trim();
String?price?=?element.element("price").getText().trim();
// 將來我們可以將上述屬性值封裝到 JavaBean 對象中的所有屬性中,加入到 List<JavaBean> 集合
System.out.println(id+":"+title+":"+auth+":"+price);
System.out.println("------------------------------");
}
}
}
?
/**
?*? 使用 dom4j 解析器
?*?1 )修改節(jié)點的屬性值
?*?2 )修改節(jié)點中的內(nèi)容
?*?3 )將內(nèi)存中的 document 對象,寫入到硬盤中的 xml 文件
?*/
public?class?Demo04?{
public?static?void?main(String[]?args)?throws?Exception{
// 創(chuàng)建 dom4j 解析器對象
SAXReader?saxReader?=?new?SAXReader();
// 創(chuàng)建 InputStream 對象,指向硬盤的 xml 文件
InputStream?is?=?
Demo04.class.getClassLoader().getResourceAsStream("cn/itcast/android/xml/bookstore.xml");
// 通過字節(jié)流,加載硬盤中的 xml 文件到內(nèi)存
Document?xmlDocument?=?saxReader.read(is);
// 獲取根節(jié)點
Element?rootElement?=?xmlDocument.getRootElement();
// 獲取根節(jié)點下所有 book 子節(jié)點所形成的集合
List<Element>?list?=?rootElement.elements("book");
// 迭代
for(Element?element?:?list){
// 如果 book 節(jié)點的 id 屬性值是 "it201501" 的話
if(element.attributeValue("id").equals("it201501")){
// 修改 book 節(jié)點的 id 屬性值
element.addAttribute("id","it201601");
}
// 如果 book 節(jié)點的 price 子節(jié)點的內(nèi)容為 222 的話
if(element.element("price").getText().equals("222")){
// 修改 book 節(jié)點的 price 子節(jié)點內(nèi)容
element.element("price").setText("333");
}
}
// 上述修改只在內(nèi)存中,還得將內(nèi)存中的 document 對象寫入到硬盤的 xml 文件中
// 緊縮格式: createCompactFormat()
// 優(yōu)美格式: createPrettyPrint()
OutputFormat?format?=?OutputFormat.createPrettyPrint();
OutputStream?os?=?new?FileOutputStream(new?File("E:/bookstore.xml"));
XMLWriter?xmlWriter?=?new?XMLWriter(os,format);
xmlWriter.write(xmlDocument);
xmlWriter.close();
}
}
?
/**
?*? 使用 dom4j 解析器
?*?1 )創(chuàng)建新節(jié)點,即 Element
?*?2 )為節(jié)點添加屬性和子節(jié)點
?*?3 )將新節(jié)點添加到所有原來節(jié)點之后和之前
?*/
public?class?Demo05?{
public?static?void?main(String[]?args)?throws?Exception{
// 創(chuàng)建 dom4j 解析器對象
SAXReader?saxReader?=?new?SAXReader();
// 創(chuàng)建 InputStream 對象,指向硬盤的 xml 文件
Document?xmlDocument?=?saxReader.read(Demo05.class.getClassLoader().getResource("cn/itcast/android/xml/bookstore.xml"));
// 獲取根節(jié)點
Element?rootElement?=?xmlDocument.getRootElement();
// 獲取根節(jié)點下的所有子節(jié)點
List<Element>?list?=?rootElement.elements("book");
?
?
// 創(chuàng)建新 book 節(jié)點
Element?newBookElement?=?DocumentHelper.createElement("book");
// 為新 book 節(jié)點設(shè)置屬性值?
newBookElement.addAttribute("id","it201503");
// 為新 book 節(jié)點添加子節(jié)點及其內(nèi)容
newBookElement.addElement("title").setText("ios 編程指南 ");
?
?
// 將新 book 節(jié)點添加到所有 book 節(jié)點之后
//list.add(newBookElement);
?
// 將新 book 節(jié)點插入到第一個位置
list.add(1,newBookElement);
?
// 將 document 對象輸出到硬盤中,形成 xml 文件
OutputFormat?format?=?OutputFormat.createPrettyPrint();
OutputStream?os?=?new?FileOutputStream(new?File("E:/bookstore.xml"));
XMLWriter?xmlWriter?=?new?XMLWriter(os,format);
xmlWriter.write(xmlDocument);
xmlWriter.close();
}
}
?
XPATH 用法
/**
?*? 使用 dom4j 解析器
?*? 傳統(tǒng)方式定位 d 標(biāo)簽
?*?XPATH 方式定位 d 標(biāo)簽
?*/
public?class?Demo06?{
public?static?void?main(String[]?args)?throws?Exception{
// 創(chuàng)建 dom4j 解析器對象
SAXReader?saxReader?=?new?SAXReader();
// 創(chuàng)建 InputStream 對象,指向硬盤的 xml 文件
Document?xmlDocument?=?
saxReader.read(
Demo06.class.getClassLoader().getResource("cn/itcast/android/xml/tv.xml"));
//Element?rootElement?=?xmlDocument.getRootElement();
//String?name?=?rootElement.element("a").element("b").element("c").element("d").getText().trim();
//System.out.println(name);
//System.out.println("----------------------------------");
//String?xpath?=?"/tv/a/b/c/d";
//String?xpath?=?"http://d";
//String?age?=?"23";
//String?xpath?=?"http://d[@age='"+age+"']";
String?xpath?=?"http://e[@name=' 哈哈 '?and?@pass='123']";
Element?element?=?(Element)?xmlDocument.selectSingleNode(xpath);
//List<Element>?list?=?xmlDocument.selectNodes(xpath);
if(element!=null){
String?name?=?element.getText().trim();
System.out.println(name);
}else{
System.out.println(" 查無此人 ");
}
}
}
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
