xPath详细教程:
http://zvon.org/xxl/XPathTutorial/General_chi/examples.html)
xPath在dom4j中的使用:
- 在项目中导入xpath支持jar包。jaxen-1.1-beta-6.jar
- 使用dom4j提供的xpath方法
- selectNodes(xpath表达式): 查询符合条件的多个节点对象
- selectSingleNode(xpath表达式) 查询符合条件的一个节点对象
xPath表达式语法:
/ :严格路径层级结构,如果在名首表示整个文档
//:不考虑层级结构
*:通配符 返回所有标签
[ ]:条件 返回带条件的标签。例如 first() last()
@:属性 返回属性
and: 逻辑与判断
=:标签属性判断
text():返回文本
xPath演练:
public class demo03 {
public static void main(String[] args) throws Exception {
//1)读取xml文件
Document doc = new SAXReader().read(new File("./src/contact.xml"));
//2)利用xpath方法查询xml文件
String xpath = "";
//2.1 /
xpath = "/contact-list"; //查询根标签contact-list
xpath = "/contact-list/contact"; //查询contact-list根标签下的contact子标签
//2.2 //
xpath = "//contact"; //选择任意层级的contact标签(不分层次)
xpath = "//contact/name"; //选择所有父标签是contact的name标签
//2.3 *
xpath = "/contact-list/*"; //选择根据标签contact-list下的所有子标签
xpath = "/contact-list//*"; //选择根标签contact-list下的所有后代标签(不分层次结构)
//2.4 [ ]
xpath = "//contact[1]";// 任意层级下的第一个contact标签
xpath = "//contact[last()]";//最后一个contact标签
//2.5 @
xpath = "//@id"; // 选择所有id属性
xpath = "//contact[@id]"; //选择所有包含id属性的contact标签
//xpath = "//contact[@id][1]"; //选择所有包含id属性的contact的第一个标签
//2.6 =
xpath = "//contact[@id='002']"; //选择id属性值为002的contact标签
//2.7 and 逻辑与
//选取id属性为002,且name属性为eric的contact标签
xpath = "//contact[@id='002' and @name='eric']";
//2.8 text() 选取文本
xpath = "//contact[@id='001']/name[1]/text()";//选择第一个name标签的文本
xpath = "//name[text()='丁昌江']";//文本内容为“丁昌江”的name标签
List<Node> list = doc.selectNodes(xpath);
for (Node node : list) {
System.out.println(node);
}
}
}
练习:
public class demo04 {
public static void main(String[] args) throws DocumentException {
SAXReader saxReader = new SAXReader();
//1.读取xml文档
Document doc = saxReader.read("./src/user.xml");
System.out.println("请输入用户名:");
//2.获取用户输入的用户名
String name = new Scanner(System.in).nextLine();
//3.匹配用户名是否存在
String userName = String.format("//name[text()='%s']", name);
if (doc.selectSingleNode(userName)!=null){
System.out.println("请输入密码:");
//4.获取用户输入的密码:
String passwd = new Scanner(System.in).nextLine();
String userPasswd = String.format("//name[text()='%s']", passwd);
//5.匹配用户输入的密码
if(doc.selectSingleNode(userPasswd)!=null){
System.out.println("登陆成功");
}else{
System.out.println("密码错误");
}
}else{
System.out.println("用户名不存在");
}
}
}
注意:
"/"在行首表示的是当前的整个文档,而不是<contact-list>标签,<contact-list>标签是其的第一个子标签;