1、xPath技术

问题:当使用dom4j查询比较深的层次结构的节点(标签,属性,文本),比较麻烦!!!

xPath作用:主要是用于快速获取所需的节点对象。



1.1、在dom4j中如何使用xPath技术

1)导入xPath支持jar包 。  jaxen-1.1-beta-6.jar(这个jar包在dom4j的压缩包中,位置:dom4j-1.6.1\lib\jaxen-1.1-beta-6.jar)

2)使用xpath方法

List selectNodes("xpath表达式");   查询多个节点对象

Node selectSingleNode("xpath表达式");  查询一个节点对象


1.2、xPath语法

xPath语法
符号
含义
/绝对路径表示从xml的根位置开始或子元素(一个层次结构)
//相对路径表示不分任何层次结构的选择元素。
*通配符表示匹配所有元素
[]条件表示选择什么条件下的元素
@属性表示选择属性节点
and关系表示条件的与关系(等价于&&)
text()文本表示选择文本内容
   



2、xPath代码示例


2.1、第一个示例

package com.rk.xml.i_xpath;

import org.dom4j.Document;
import org.dom4j.Node;

import com.rk.utils.Dom4jUtil;

/**
 * 第一个示例
 * @author RK
 *
 */
public class Demo01
{
	public static void main(String[] args)
	{
		/**
		 * 需求: 删除id值为“c002”的Cat标签
		 */
		Document doc = Dom4jUtil.openDocument("./src/animals.xml");
		//1.查询id值为“c002”的Cat标签
		//使用xpath技术
		Node targetNode = doc.selectSingleNode("//Cat[@id='c002']");
		//2.删除标签
		targetNode.detach();
		
		Dom4jUtil.saveDocument(doc, "D:/rk/result.xml");
		System.out.println("执行结束!");
	}
}



2.2、xPath表达式语法

package com.rk.xml.i_xpath;

import java.util.List;

import org.dom4j.Document;
import org.dom4j.Node;

import com.rk.utils.Dom4jUtil;

/**
 * 学习xPath表达式语法
 * @author RK
 *
 */
public class Demo02
{
	public static void main(String[] args)
	{
		String sourceXML = "./src/animals.xml";
		String targetXML = "D:/rk/result.xml";
		Document doc = Dom4jUtil.openDocument(sourceXML);
		String xpath = "";
		
		/**
		 * 1.  	/      绝对路径      表示从xml的根位置开始或子元素(一个层次结构)
		 */
		xpath = "/Animals";
		xpath = "/Animals/Cat/Home";
		
		/**
		 * 2. //     相对路径       表示不分任何层次结构的选择元素。
		 */
		xpath = "//Dog/Home";
		xpath = "//Home";
		
		/**
		 * 3. *      通配符         表示匹配所有元素
		 */
		xpath = "/Animals/*";//根标签Animals下的所有子标签
		xpath = "/Animals//*";//根标签Animals下的所有标签(不分层次结构)
		
		/**
		 * 4. []      条件           表示选择什么条件下的元素
		 */
		xpath = "/Animals/Cat[2]";//第二个的Cat标签
		xpath = "/Animals/*[last()]";//最后一个的Animals的子标签
		xpath = "//*[@id]";//带有id属性的标签
		
		/**
		 * 5. @     属性            表示选择属性节点
		 */
		xpath = "//@id"; //选择id属性节点对象,返回的是Attribute对象
		xpath = "//*[not(@id)]";//选择不包含id属性的标签节点
		xpath = "//Cat[@id='c002']";//选择id属性值为c002的Cat标签
		xpath = "//Cat[@id='c002' and @name='咪咪']";//选择id属性值为c002,且name属性为咪咪的Cat标签
		
		/**
		 *6.  text()   表示选择文本内容
		 */
		//选择Home标签下的文本内容,返回Text对象
		xpath = "//Home/text()";
		xpath = "//Cat/Home[text()='地球']";//选择Home为“地球”的Cat标签
		
		@SuppressWarnings("unchecked")
		List<Node> list = doc.selectNodes(xpath);
		for(Node node : list)
		{
			System.out.println(node);
		}
		
		Dom4jUtil.saveDocument(doc, targetXML);
	}
}