如果需要从XML文件中检索需要的某个信息(如name)怎么解决?
示例:





| 方法名 | 说明 |
|---|---|
| Node selectSingleNode(“表达式”) | 获取符合表达式的唯一元素 |
| List< Node> selectNodes(“表达式”) | 获取符合表达式的元素集合 |
| 方法名 | 说明 |
|---|---|
| /根元素/子元素/孙元素 | 从根元素开始,一级一级向下查找,不能跨级 |
| 方法名 | 说明 |
|---|---|
| /子元素/孙元素 | 从当前元素开始,一级一级向下查找,不能跨级 |
| 方法名 | 说明 |
|---|---|
| //contact | 找contact元素,无论元素在哪里 |
| //contact/name | 找contact,无论在哪一级,但name一定是contact的子节点 |
| //contact//name | contact无论在哪一种,name只要是contact的子孙元素都可以找到 |
| 方法名 | 说明 |
|---|---|
| //@属性名 | 查找属性对象,无论是哪个元素,只要有这个属性即可 |
| //元素[@属性名] | 查找元素对象,全文搜索指定元素名和属性名 |
| //元素[@属性名=‘值’] | 查找元素对象,全文搜索指定元素名和属性名,并且属性值相等 |










潘金莲
女
武松
男
武大郎
男
我是西门庆
/**
目标:XPath检索XML中的信息啊。(了解)
引入:
Dom4J可以用于解析整个XML的数据。
但是如果要检索XML中的某些信息,建议使用XPath.(Xpath依赖Dom4j技术)
Dom4J用于解析数据,Xpath用于检索数据。
XPath使用步骤:
1.导入dom4j框架。(XPath依赖于Dom4j技术,必须先导入dom4j框架!)
2.导入XPath独有的框架包。jaxen-1.1.2.jar
XPath常用API:
List selectNodes(String var1):检索出一批节点集合。
Node selectSingleNode(String var1):检索出一个节点返回。
XPath提供的四种检索数据的写法:
1.绝对路径。
2.相对路径。
3.全文搜索。
4.属性查找。
小结:
1.绝对路径: /根元素/子元素/子元素。
2.相对路径: ./子元素/子元素。 (.代表了当前元素)
3.全文搜索:
//元素 在全文找这个元素
//元素1/元素2 在全文找元素1下面的一级元素2
//元素1//元素2 在全文找元素1下面的全部元素2
4.属性查找。
//@属性名称 在全文检索属性对象。
//元素[@属性名称] 在全文检索包含该属性的元素对象。
//元素[@属性名称=值] 在全文检索包含该属性的元素且属性值为该值的元素对象。
*/
public class XPathDemo {
/**
* 1.绝对路径: /根元素/子元素/子元素。
*/
@Test
public void parse01() throws Exception {
// a、创建解析器对象
SAXReader saxReader = new SAXReader();
// b、把XML加载成Document文档对象
Document document = saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
// c、检索全部的名称
List nameNodes = document.selectNodes("/contactList/contact/name");
for (Node nameNode : nameNodes) {
Element nameEle = (Element) nameNode;
System.out.println(nameEle.getTextTrim());
}
}
/**
* 2.相对路径: ./子元素/子元素。 (.代表了当前元素)
*/
@Test
public void parse02() throws Exception {
// a、创建解析器对象
SAXReader saxReader = new SAXReader();
// b、把XML加载成Document文档对象
Document document = saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
Element root = document.getRootElement();
// c、检索全部的名称
List nameNodes = root.selectNodes("./contact/name");
for (Node nameNode : nameNodes) {
Element nameEle = (Element) nameNode;
System.out.println(nameEle.getTextTrim());
}
}
/**
* 3.全文搜索:
* //表示全文
* //元素 在全文找这个元素
* //元素1/元素2 在全文找元素1下面的一级元素2
* //元素1//元素2 在全文找元素1下面的全部元素2
*/
@Test
public void parse03() throws Exception {
// a、创建解析器对象
SAXReader saxReader = new SAXReader();
// b、把XML加载成Document文档对象
Document document = saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
// c、检索数据
List nameNodes1 = document.selectNodes("//name");
for (Node nameNode : nameNodes1) {
Element nameEle = (Element) nameNode;
System.out.println(nameEle.getTextTrim());
}
List nameNodes2 = document.selectNodes("//contact/name");
for (Node nameNode : nameNodes2) {
Element nameEle = (Element) nameNode;
System.out.println(nameEle.getTextTrim());
}
List nameNodes3 = document.selectNodes("//contact//name");
for (Node nameNode : nameNodes3) {
Element nameEle = (Element) nameNode;
System.out.println(nameEle.getTextTrim());
}
}
/**
* 4.属性查找。
* //@属性名称 在全文检索属性对象。
* //元素[@属性名称] 在全文检索包含该属性的元素对象。
* //元素[@属性名称=值] 在全文检索包含该属性的元素且属性值为该值的元素对象。
*/
@Test
public void parse04() throws Exception {
// a、创建解析器对象
SAXReader saxReader = new SAXReader();
// b、把XML加载成Document文档对象
Document document = saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
// c、检索数据
List nodes = document.selectNodes("//@id");
for (Node node : nodes) {
Attribute attr = (Attribute) node;
System.out.println(attr.getName() + "===>" + attr.getValue());
}
// 查询name元素(包含id属性的)
Node node1 = document.selectSingleNode("//name[@id]");
Element ele1 = (Element) node1;
System.out.println(ele1.getTextTrim());
Node node2 = document.selectSingleNode("//name[@id=888]");
Element ele2 = (Element) node2;
System.out.println(ele2.getTextTrim());
}
}
Xpath作用,四大类