使用XPath技术定位xml文件
1.xpath技术的作用:快速定位至某个节点对象(当xml层级关系结构很深的时候可以使用此技术解决)
2.在开发工具eclipse的项目中导入 jaxen-1.1-beta-6.jar 包,方法同dom4j工具包
3.xpath中常使用的两个方法:
(1)Node node = 文档对象/节点对象.selectSingleNode(“xpath…”);
(2)List<Node> list = 文档对象/节点对象.selectNodes(“xpath...”);
xpath语法
(1)/:在xml文件中表示绝对路径。如果一个斜线开头,选择的是根元素 例如:/AAA ,如果斜线在中间,表示根元素下的子元素 例如:/AAA/BBB
(2)//:在xml文件中表示一中不分层级关系,// 开头后面的元素出现了都要被选中 例如://contact
(3)*:表示通配符,选中所有的元素 例如:/AAA/BBB/* 表示AAA节点下的BBB元素所有的子节点全被选中
(4)[]:表示限定,进一步制定元素 例如://contact[1] 表示不分层级关系的选中第一个contact标签
(5)@:属性前添加的前缀 例如://contact[@id] 表示选中不分层级关系含有id属性的contact标签
(6)=:指定属性值或者是文本内容 例1://contact[@id='001'] 例2://name[text()='伊卡尔迪']
(7)and:表示逻辑关系“与”
练习1:xpath语法练习
import java.io.File;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
public class Test1 {
public static void main(String[] args) {
try {
// 获取文档对象
Document doc = new SAXReader().read(new File("./src/contact.xml"));
// 定义xpath
String xpath="";
xpath = "//name[text()='伊卡尔迪']";
xpath = "//contact[@id='001' and @name='s1']";
xpath = "//contact[last()]"; //调用last() 获取最后一个contact节点
// 遍历
List<Node> list = doc.selectNodes(xpath);
if(list != null) {
for(Node node:list) {
System.out.println(node);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
练习2:使用xpath技术定位解析html文件
/*
* 利用xpath技术定位解析html文件
* */
import java.io.File;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Test2 {
public static void main(String[] args) {
try {
// 读取FriendsList.html文件
Document doc = new SAXReader().read(new File("./src/FriendsList.html"));
// 获取tilte标题内容
Element titleElement = (Element) doc.selectSingleNode("//title"); // 该方法返回的为Node类型,强转为Element类型
System.out.println(titleElement.getText());// 获取title标签的文本内容
// 获取table表格中的内容:
/**
* 编号 姓名 性别 年龄 地址 电话 1 xx xx xx xxx xxx
*/
// 利用xpath定位到所有的tr节点对象
List<Element> list = doc.selectNodes("//tbody/tr");
System.out.println("编号\t姓名\t性别\t年龄\t地址\t\t电话");
if (list != null) {
// 遍历每一个tr节点对象
for (Element e : list) {
// 利用xpath获取文本内容
String id = e.selectSingleNode("td[1]").getText();
String name = e.selectSingleNode("td[2]").getText();
String gender = e.selectSingleNode("td[3]").getText();
String age = e.selectSingleNode("td[4]").getText();
String address = e.selectSingleNode("td[5]").getText();
String phone = e.selectSingleNode("td[6]").getText();
System.out.println(id + "\t" + name + "\t" + gender + "\t" + age + "\t" + address + "\t\t" + phone);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
效果: