XPath技術
1 引入
問題:當使用dom4j查詢比較深的層次結構的節點(標簽,屬性,文本),比較麻煩!!!
2 xPath作用
主要是用於快速獲取所需的節點對象。
3 在dom4j中如何使用xPath技術
1)導入xPath支持jar包 。 jaxen-1.1-beta-6.jar
2)使用xpath方法
List<Node> selectNodes("xpath表達式"); 查詢多個節點對象
Node selectSingleNode("xpath表達式"); 查詢一個節點對象
4 xPath語法
/ 絕對路徑 表示從xml的根位置開始或子元素(一個層次結構)
// 相對路徑 表示不分任何層次結構的選擇元素。
* 通配符 表示匹配所有元素
[] 條件 表示選擇什么條件下的元素
@ 屬性 表示選擇屬性節點
and 關系 表示條件的與關系(等價於&&)
text() 文本 表示選擇文本內容
5 案例
用戶登錄功能:
用戶輸入用戶名和密碼 -> 到“數據庫”查詢是否有對應的用戶 ->
有: 則表示登錄成功
沒有: 則表示登錄失敗
用xml當做數據庫
user.xml 用來存儲用戶的數據
1、模擬用戶登錄效果
package gz.itcast.b_xpath;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* xpath案例: 模擬用戶登錄效果
* @author APPle
*
*/
public class Demo3 {
public static void main(String[] args)throws Exception{
//1.獲取用戶輸入的用戶名和密碼
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
System.out.println("請輸入用戶名:");
String name = br.readLine();
System.out.println("請輸入密碼:");
String password = br.readLine();
//2.到“數據庫”中查詢是否有對應的用戶
//對應的用戶: 在user.xml文件中找到一個
//name屬性值為‘用戶輸入’,且password屬性值為‘用戶輸入’的user標簽
Document doc = new SAXReader().read(new File("./src/user.xml"));
Element userElem = (Element)doc.selectSingleNode("//user[@name='" +name +"' and @password='"+password+"']");
if(userElem!=null){
//登錄成功
System.out.println("登錄成功");
}else{
//登錄失敗
System.out.println("登錄失敗");
}
}
}
2、讀取一個規范的html
package gz.itcast.b_xpath;
import java.io.File;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* 使用xpath技術讀取一個規范的html文檔
* @author APPle
*
*/
public class Demo4 {
public static void main(String[] args) throws Exception{
Document doc = new SAXReader().read(new File("./src/personList.html"));
//System.out.println(doc);
//讀取title標簽
Element titleElem = (Element)doc.selectSingleNode("//title");
String title = titleElem.getText();
System.out.println(title);
/**
* 練習:讀取聯系人的所有信息
* 按照以下格式輸出:
* 編號:001 姓名:張三 性別:男 年齡:18 地址:xxxx 電話: xxxx
* 編號:002 姓名:李四 性別:女 年齡:20 地址:xxxx 電話: xxxx
* ......
*/
//1.讀取出所有tbody中的tr標簽
List<Element> list = (List<Element>)doc.selectNodes("//tbody/tr");
//2.遍歷
for (Element elem : list) {
//編號
//String id = ((Element)elem.elements().get(0)).getText();
String id = elem.selectSingleNode("td[1]").getText();
//姓名
String name = ((Element)elem.elements().get(1)).getText();
//性別
String gender = ((Element)elem.elements().get(2)).getText();
//年齡
String age = ((Element)elem.elements().get(3)).getText();
//地址
String address = ((Element)elem.elements().get(4)).getText();
//電話
String phone = ((Element)elem.elements().get(5)).getText();
System.out.println("編號:"+id+"\t姓名:"+name+"\t性別:"+
gender+"\t年齡:"+
age+"\t地址:"+address+
"\t電話:"+phone);
}
}
}