xPath小结

        有了XML数据的描述标准,人们自然就会想到应该有一种查询语言可以在XML中查找任意节点的数据,就像SQL语句可以在关系性数据库中执行查询操作一样,于是XQUERY和XPATH顺应潮流,应运而生。由于XQUERY较为复杂,使用不甚方便,XPATH渐渐成为主流。xPath 是一个 W3C 标准, 它 是 XSLT 中的主要元素,包含一个标准函数库,使用路径表达式在 XML 文档中进行导航。

        XPATH遵循文档对象模型(DOM)的路径格式,由于每个XML文档都可以看成是一棵拥有许多结点的树,每个结点可以是以下七个类型之一:根(root)、元素(element)、属性(attribute)、正文(text)、命名空间(namespace)、处理指令(processing instruction)和注释(comment)。

       XPATH的基本语法由表达式构成。在计算表达式的值之后产生一个对象,这种对象有以下四种基本类型:节点集合、布尔型、数字型和字符串型 。

      采用xpath查找需要引入jaxen-xx-xx.jar,否则会java.lang.NoClassDefFoundError:org/jaxen/JaxenException异常。

下面是我做的一些基础知识整理:

(一)常见的路径表达式

(二)常见谓语的一些路径表达式

(1)  索引某特定条件的元素,如下:

(2)  选择特定属性的元素

(3)  元素值在某范围的元素

(三)选取未知节点

(四)运算符

(五)代码测试

(1)xPath.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<A id="a1">
	  <B id="b1">
		<C id="c1" name="ccc">
		  <G id="g1">
			  <B name="b"/>
			  <D id="d1"/>
			  <E id="e1"/>
			  <E id="e2"/>
		  </G>
		</C>
	  </B>
	  <B id="b2"/>
	  <C id="c2">
	    <B/>
		<D id="d2"/>
		<F/>
	  </C>
	  <E/>
</A> 

(2)java代码文件

package xPath;

import java.io.File;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
 * xpath查询xml节点测试
 * @author lsh
 *
 */
public class xPath {

	public static  void main(String[] args){
		
		    File file = new File("src/xpathTest.xml");
			SAXReader reader = new SAXReader();
			try {
				Document doc =  reader.read(file);
				
				//表达式路径:nodename; 结果:选取nodename元素的所有子元素
				Element xpathElt =(Element)doc.selectSingleNode("A");
				for (Iterator i =xpathElt.elementIterator();i.hasNext();) {
					Element element =(Element)i.next();
					System.out.println("显示: "  + element.getName() ); 			
				}
				System.out.println("____________(一)___________________");
			    
				//表达式路径:/rootname; 结果:选取rootname根元素
				Element xpathElt1 =(Element)doc.selectSingleNode("/A");
				String elemName =xpathElt1.attributeValue("id");
				System.out.println(elemName);			
				System.out.println("____________(二)___________________");
				
				//表达式路径:nodename/childname; 结果:选取nodename下名字为childname的所有子元素。
				Element xpathElt2 =(Element)doc.selectSingleNode("A/C");
				for (Iterator i =xpathElt2.elementIterator();i.hasNext();) {
					Element element =(Element)i.next();
					System.out.println("显示: "  + element.getName() ); 			
				}		
				System.out.println("_____________(三)__________________");
				
				//表达式路径://childname; 结果:选取所有childname子元素,而不管它们在文档中的位置
				Element xpathElt3 =(Element)doc.selectSingleNode("//C");
				for (Iterator i =xpathElt3.elementIterator();i.hasNext();) {
					Element element =(Element)i.next();
					System.out.println("显示: "  + element.getName() ); 			
				}		
				System.out.println("______________(四)_________________");
				
				//表达式路径:nodename//childname; 结果:选取nodename下名字为 childname的所有后代元素,而不管它们位于 bookstore 之下的什么位置
				Element xpathElt4 =(Element)doc.selectSingleNode("A//B");
				for (Iterator i =xpathElt4.elementIterator();i.hasNext();) {
					Element element =(Element)i.next();
					System.out.println("显示: "  + element.getName() ); 			
				}		
				System.out.println("_______________(五)________________");
				
				//表达式路径://@childname; 结果:选取所有名为 childname的属性
				List list =doc.selectNodes("//@name");
				Iterator iter = list.iterator();
				
				while (iter.hasNext()) {
				Attribute attribute = (Attribute) iter.next();
				System.out.println(attribute.getValue());
				
				}
				System.out.println("________________(六)_______________");
				
			   //查找C元素下属性id=‘c2’的特定C元素
			   Element xpathElt5 =(Element)doc.selectSingleNode("//C[@id='c2']");
			   System.out.println(xpathElt5.getName());
			   System.out.println("__________________(七)_____________");
			   
			   
			} catch (Exception e) {
				e.printStackTrace();
			}		
	
	}			
}   

 (3)测试结果

    

     总之,因为xPath使用路径表达式查询XML中查找任意节点的数据,给我们带来了方便,大大解除了我们解析XML的困绕。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值