XPath详解
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() 文本 表示选择文本内容
代码练习:
package com.dom4j.xpath; import java.io.File;
import java.util.List; import org.dom4j.Document;
import org.dom4j.Node;
import org.dom4j.io.SAXReader; public class xpathExercise { public static void main(String[] args) throws Exception {
Document doc = new SAXReader().read(new File("./src/contact.xml"));
String xpath = "";
xpath = "/contactList";
xpath = "//contact/name";
xpath = "//name";
xpath = "/*/*/age";
xpath = "/contactList/*";
xpath = "/contactList//*";
xpath = "//contact[@value]";
xpath = "//contact[@id]";
xpath = "//contact[2]";
xpath = "//contact[last()]";
xpath = "//@id";
xpath = "//contact[not(@id)]";
xpath = "//contact[@id='003' and @value='hello']";
xpath = "//name/text()";//返回ext
xpath = "//contact/name[text()='张三']";
List<Node> list = doc.selectNodes(xpath);
for(Node node : list){
System.out.println(node);
}
} }
5 案例
用户登录功能:
用户输入用户名和密码 -> 到“数据库”查询是否有对应的用户 ->
有: 则表示登录成功
没有: 则表示登录失败
用xml当做数据库
user.xml 用来存储用户的数据
练习代码:
package com.xpath.example; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List; import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader; public class userLogin {
public static void main(String[] args) throws Exception {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入用户名:");
String user = reader.readLine(); System.out.println("请输入密码: ");
String pwd = reader.readLine(); Document doc = new SAXReader().read("./src/user.xml");
/*
String xpath = "/users/user";
List<Node> list = doc.selectNodes(xpath);
String id, name, passwd;
for(Node node : list){
Element auser = (Element)node;
id = auser.attribute("id").getValue();
name = auser.attribute("name").getValue();
passwd = auser.attribute("password").getValue();
if(name.equals(user) && passwd.equals(pwd)){
System.out.println(id + "在数据库中");
}
}
*/
Element userElement = (Element)doc.selectSingleNode("//user[@name='" + user +"' and @password='" + pwd +"']");
if(userElement == null){
System.out.println("登录失败");
}else{
System.out.println("登录成功");
} } }
练习:读取一个html中的用户信息
person.html:
<html>
<head>
<title>传智播客1月18号班通讯录</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
</head>
<body>
<center><h1>12月16号就业班通讯录</h1></center>
<table border="1" align="center" id="contactForm">
<thead>
<tr><th>编号</th><th>姓名</th><th>性别</th><th>年龄</th><th>地址</th><th>电话</th></tr>
</thead>
<tbody>
<tr>
<td>001</td>
<td>张三</td>
<td>男</td>
<td>18</td>
<td>广州市天河区</td>
<td>134000000000</td>
</tr>
<tr>
<td>002</td>
<td>李四</td>
<td>女</td>
<td>20</td>
<td>广州市越秀区</td>
<td>13888888888</td>
</tr>
<tr>
<td>002</td>
<td>郭靖</td>
<td>男</td>
<td>30</td>
<td>广州市番禺区</td>
<td>1342214321</td>
</tr>
</tbody>
</table>
</body>
</html>
person类:
package com.xpath.example; public class Person {
private String id;
private String name;
private String age;
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
private String sex;
private String addr;
private String phone;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String toString() {
return "Person \n id=" + id + ", name=" + name + ", age=" + age + ", sex=" + sex
+ ", addr=" + addr + ", phone=" + phone + "\n";
} }
读取html写入person的主类:
package com.xpath.example; import java.io.File;
import java.util.List; import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; public class read_html { public static void main(String[] args) throws Exception {
Document doc = new SAXReader().read(new File("./src/personList.html"));
List nodes = doc.selectNodes("//tr");
// System.out.println(nodes);
int num = nodes.size();
Person[] persons = new Person[num];
Element trNode;
for(int i = 1; i < num; i++){
persons[i] = new Person();
trNode = (Element)nodes.get(i);
//System.out.println(trNode.selectSingleNode("td[1]"));
persons[i].setId(trNode.selectSingleNode("td[1]").getText());
persons[i].setName(((Element)trNode.elements().get(1)).getText());
persons[i].setSex(((Element)trNode.elements().get(2)).getText());
persons[i].setAge(((Element)trNode.elements().get(3)).getText());
persons[i].setAddr(((Element)trNode.elements().get(4)).getText());
persons[i].setPhone(((Element)trNode.elements().get(5)).getText());
System.out.println(persons[i]);
}
} }
XPath详解的更多相关文章
- DOM4J介绍与代码示例(2)-XPath 详解
XPath 详解,总结 XPath简介 XPath是W3C的一个标准.它最主要的目的是为了在XML1.0或XML1.1文档节点树中定位节点所设计.目前有XPath1.0和 XPath2.0两个版本.其 ...
- 网页元素定位神器之Xpath详解
摘要: 经常在工作中会使用到XPath的相关知识,但每次总会在一些关键的地方不记得或不太清楚,所以免不了每次总要查一些零碎的知识,感觉即很烦又浪费时间,所以对XPath归纳及总结一下. ... ...
- XPath 详解,总结
XPath简介 XPath是W3C的一个标准.它最主要的目的是为了在XML1.0或XML1.1文档节点树中定位节点所设计.目前有XPath1.0和XPath2.0两个版本.其中Xpath1.0是199 ...
- 定位页面元素之xpath详解以及定位不到测试元素的常见问题
一.定位元素的方法 id:首选的识别属性,W3C标准推荐为页面每一个元素设置一个独一无二的ID属性, 如果没有且很难找到唯一属性,解决方法:(1)找开发把id或者name加上.如果不行,解决思路可以是 ...
- 爬虫之Xpath详解
XPath介绍 XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML 文档中对元素和属性进行遍历. XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 ...
- python应用:爬虫框架Scrapy系统学习第一篇——xpath详解
HTML的三大概念:标签.元素以及属性 标签:尖括号中的文本 例:<head>……</head> 标签通常成对出现 元素:标签中的所有内容 元素中可包 ...
- C#解析XML详解(XPath以及带命名空间NameSpace)
<?xml version="1.0" encoding="utf-8" ?> <bookstore> <book> < ...
- xpath定位方法详解
1.xpath较复杂的定位方法: 现在要引用id为“J_password”的input元素,可以像下面这样写: WebElement password = driver.findElement(By. ...
- selenium+Java,xpath定位方法详解(搬运留存)
用xpath绝对路径比较费事费力,还容易报错,下面几种模糊定位比较灵活好用 driver.findElement(By.xpath("//*[@id='J_login_form']/dl/d ...
随机推荐
- SMO(Sequential Minimal Optimization) 伪代码(注释)
Algorithm: Simplified SMO 这个版本是简化版的,并没有采用启发式选择,但是比较容易理解. 输入: C: 调和系数 tol: 容差 (tolerance) max passes: ...
- 设计模式(Java版)-创建型模式之简单工厂模式
前言:这段时间在学习设计模式,本人也是小菜一枚(所以写的如果有错误的地方请大大们给予指出).这个东西也是我一直想学习的,从点点滴滴做起,记录下自己每天的领悟! 一.工厂模式的动机 在软件系统中,经常面 ...
- Java 之文件目录操作
1.判断文件是否存在 File file = new File("d:\\study\\temp\\test.java"); boolean bl = file.exists(); ...
- Handler Looper 原理 详解
演示代码 public class MainActivity extends ListActivity { private TextView tv_info; private CalT ...
- Aspose.Words导出dt到word的问题
已解决:单挑数据导入到一个word文档,导出文字和图片成功,执行Main();方法导出dt到word 待解决:多条数据(文字,图片的导入到一个word文档里面)从dt导入到word;已发现的错误提示“ ...
- FileStream操作文件读写
FileStream fsRead = new FileStream(@"C:\Users\Administrator\Desktop\u.html",FileMode.OpenO ...
- QT小插件类之QRoundProgressBar
QRoundProgressBar类 1. 详细描述 QRoundProgressBar类能够实现一个圆形的进度图表,并且有和QProgressBar类似的API接口 1.1 继承关系 #includ ...
- angular json转义html
第一步json输出的内容反编码 function htmldecode(s){ var div = document.createElement('div'); div.innerHTML = s; ...
- PHP正则表达式屏蔽电话号码中间段
要屏蔽电话号码中间段,首先要知道电话号码的正则表达式. 先来看看PHP匹配电话号码的正则表达式. 匹配固定电话的正则表达式为: /(0[0-9]{2,3}[\-]?[2-9][0-9]{6,7}[\- ...
- http://www.cnblogs.com/zhuli19901106/p/4356419.html
http://www.cnblogs.com/zhuli19901106/p/4356419.html