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详解的更多相关文章

  1. DOM4J介绍与代码示例(2)-XPath 详解

    XPath 详解,总结 XPath简介 XPath是W3C的一个标准.它最主要的目的是为了在XML1.0或XML1.1文档节点树中定位节点所设计.目前有XPath1.0和 XPath2.0两个版本.其 ...

  2. 网页元素定位神器之Xpath详解

    摘要: 经常在工作中会使用到XPath的相关知识,但每次总会在一些关键的地方不记得或不太清楚,所以免不了每次总要查一些零碎的知识,感觉即很烦又浪费时间,所以对XPath归纳及总结一下. ...     ...

  3. XPath 详解,总结

    XPath简介 XPath是W3C的一个标准.它最主要的目的是为了在XML1.0或XML1.1文档节点树中定位节点所设计.目前有XPath1.0和XPath2.0两个版本.其中Xpath1.0是199 ...

  4. 定位页面元素之xpath详解以及定位不到测试元素的常见问题

    一.定位元素的方法 id:首选的识别属性,W3C标准推荐为页面每一个元素设置一个独一无二的ID属性, 如果没有且很难找到唯一属性,解决方法:(1)找开发把id或者name加上.如果不行,解决思路可以是 ...

  5. 爬虫之Xpath详解

    XPath介绍 XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML 文档中对元素和属性进行遍历. XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 ...

  6. python应用:爬虫框架Scrapy系统学习第一篇——xpath详解

    HTML的三大概念:标签.元素以及属性 标签:尖括号中的文本       例:<head>……</head> 标签通常成对出现 元素:标签中的所有内容        元素中可包 ...

  7. C#解析XML详解(XPath以及带命名空间NameSpace)

    <?xml version="1.0" encoding="utf-8" ?> <bookstore> <book> < ...

  8. xpath定位方法详解

    1.xpath较复杂的定位方法: 现在要引用id为“J_password”的input元素,可以像下面这样写: WebElement password = driver.findElement(By. ...

  9. selenium+Java,xpath定位方法详解(搬运留存)

    用xpath绝对路径比较费事费力,还容易报错,下面几种模糊定位比较灵活好用 driver.findElement(By.xpath("//*[@id='J_login_form']/dl/d ...

随机推荐

  1. SMO(Sequential Minimal Optimization) 伪代码(注释)

    Algorithm: Simplified SMO 这个版本是简化版的,并没有采用启发式选择,但是比较容易理解. 输入: C: 调和系数 tol: 容差 (tolerance) max passes: ...

  2. 设计模式(Java版)-创建型模式之简单工厂模式

    前言:这段时间在学习设计模式,本人也是小菜一枚(所以写的如果有错误的地方请大大们给予指出).这个东西也是我一直想学习的,从点点滴滴做起,记录下自己每天的领悟! 一.工厂模式的动机 在软件系统中,经常面 ...

  3. Java 之文件目录操作

    1.判断文件是否存在 File file = new File("d:\\study\\temp\\test.java"); boolean bl = file.exists(); ...

  4. Handler Looper 原理 详解

    演示代码 public class MainActivity extends ListActivity {     private TextView tv_info;     private CalT ...

  5. Aspose.Words导出dt到word的问题

    已解决:单挑数据导入到一个word文档,导出文字和图片成功,执行Main();方法导出dt到word 待解决:多条数据(文字,图片的导入到一个word文档里面)从dt导入到word;已发现的错误提示“ ...

  6. FileStream操作文件读写

    FileStream fsRead = new FileStream(@"C:\Users\Administrator\Desktop\u.html",FileMode.OpenO ...

  7. QT小插件类之QRoundProgressBar

    QRoundProgressBar类 1. 详细描述 QRoundProgressBar类能够实现一个圆形的进度图表,并且有和QProgressBar类似的API接口 1.1 继承关系 #includ ...

  8. angular json转义html

    第一步json输出的内容反编码 function htmldecode(s){ var div = document.createElement('div'); div.innerHTML = s; ...

  9. PHP正则表达式屏蔽电话号码中间段

    要屏蔽电话号码中间段,首先要知道电话号码的正则表达式. 先来看看PHP匹配电话号码的正则表达式. 匹配固定电话的正则表达式为: /(0[0-9]{2,3}[\-]?[2-9][0-9]{6,7}[\- ...

  10. http://www.cnblogs.com/zhuli19901106/p/4356419.html

    http://www.cnblogs.com/zhuli19901106/p/4356419.html