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

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