xPath技术
问题:当使用dom4j查询比较深的层次结构的节点(标签,属性,文本),比较麻烦!!!
xPath作用
主要是用于快速获取所需的节点对象。
在dom4j中如何使用xPath技术
1、导入xPath支持jar包 。 jaxen-1.1-beta-6.jar
2、使用xpath方法
List<Node> selectNodes("xpath表达式"); 查询多个节点对象
Node selectSingleNode("xpath表达式"); 查询一个节点对象
xPath语法
/ 绝对路径 表示从xml的根位置开始或子元素(一个层次结构)
// 相对路径 表示不分任何层次结构的选择元素。
* 通配符 表示匹配所有元素
[] 条件 表示选择什么条件下的元素
@ 属性 表示选择属性节点
and 关系 表示条件的与关系(等价于&&)
text() 文本 表示选择文本内容
作业:
用户登录功能:
用户输入用户名和密码 -> 到“数据库”查询是否有对应的用户 ->
有: 则表示登录成功
没有: 则表示登录失败
用xml当做数据库
user.xml 用来存储用户的数据
import java.io.File;
import java.io.FileOutputStream;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter; public class Demo2 { public static void main(String[] args) throws Exception{
// 需求: 删除id值为2的学生标签
Document doc = new SAXReader().read(new File("F:/a.xml"));
//1.查询id为2的学生标签
//使用xpath技术
Element stuElem = (Element)doc.selectSingleNode("//Student[@id='2']");
//2.删除标签
stuElem.detach();
//3.写出xml文件
FileOutputStream out = new FileOutputStream("e:/student.xml");
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");
XMLWriter writer = new XMLWriter(out,format);
writer.write(doc);
writer.close();
} }
import java.io.File;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Node;
import org.dom4j.io.SAXReader; public class Demo3 { public static void main(String[] args) throws Exception {
Document doc = new SAXReader().read(new File("./src/contact.xml")); String xpath = "";
/**
* 1.绝对路径, 表示从xml的根位置开始或子元素(一个层次结构)
*/
xpath = "/contactList";
xpath = "/contactList/contact";
/**
* 2.相对路径, 表示不分任何层次结构的选择元素。
*/
xpath = "//contact/name";
xpath = "//name";
/**
* 3. 通配符,表示匹配所有元素
*/
xpath = "/contactList/*";
xpath = "/contactList//*";
/**
* 4.条件,表示选择什么条件下的元素
*/
//带有id属性的contact标签
xpath = "//contact[@id]";
//第二个的contact标签
xpath = "//contact[2]";
//选择最后一个contact标签
xpath = "//contact[last()]";
/**
* 5.属性,表示选择属性节点
*/
xpath = "//@id";
xpath = "//contact[not(@id)]";
xpath = "//contact[@id='002']";
xpath = "//contact[@id='001' and @name='eric']";
/**
*6.表示选择文本内容
*/
//选择name标签下的文本内容,返回Text对象
xpath = "//name/text()";
xpath = "//contact/name[text()='李杰']";
List<Node> list = doc.selectNodes(xpath);
for (Node node : list) {
System.out.println(node);
}
}
}
//模拟登陆
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; public class Demo4 { 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.到“数据库”中查询是否有对应的用户
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("登录失败");
}
}
}
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; public class Demo5 { public static void main(String[] args) throws Exception{
Document doc = new SAXReader().read(new File("./src/personList.html"));
//读取title标签
Element titleElem = (Element)doc.selectSingleNode("//title");
String title = titleElem.getText();
System.out.println(title);
//1.读取出所有tbody中的tr标签
List<Element> list = (List<Element>)doc.selectNodes("//tbody/tr");
//2.遍历
for (Element elem : list) {
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);
}
}
}