`

dom4j中XPath用法

    博客分类:
  • XML
阅读更多
大家经常运用DOM4J操作XML文档,如果XML文档存在namespace的话,读写XML经常不工作。下面是一个简单的例子,例子中需要用到的两个xml文件:a.xml与book.xml见附件。代码如下:
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;   
import javax.xml.parsers.DocumentBuilderFactory;   
import javax.xml.xpath.XPath;   
import javax.xml.xpath.XPathConstants;   
import javax.xml.xpath.XPathExpression;   
import javax.xml.xpath.XPathFactory;   
  
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

  
public class XpathTest {   
		/**
	     * 已知命名空间,获得该命名空间下节点
	     * @throws Exception
	     */
	    public static void test1() throws Exception {
	     	SAXReader reader = new SAXReader();
	     	String uri = "http://WebXml.com.cn/";//命名空间
	     	HashMap map = new HashMap();//将uri存入map中
	     	map.put("xx", uri);
	     	reader.getDocumentFactory().setXPathNamespaceURIs(map);
	     	
	     	InputStream is = new FileInputStream("src/a.xml");
				org.dom4j.Document document = reader.read(is);
				
	     	org.dom4j.XPath xpath = DocumentHelper.createXPath("//xx:string");
	     	
	     	List list = xpath.selectNodes(document);//等价List list = document.selectNodes("//xx:string");
	     	for(int i=0; i<list.size(); i++){
	     		Node node = (Node)list.get(i);//转型为Node
	     		System.out.println("hah====="+node.getText());
	     		
	     		Element e = (Element)list.get(i);//转型为Element
	     		System.out.println(e.getText());
	     	}
	    }
	
        /**
         * 先通过document获得命名空间,再获得该命名空间下节点
         * @throws Exception
         */
        public static void test2()  throws Exception {
        	SAXReader reader = new SAXReader();
        	InputStream is = new FileInputStream("src/a.xml");
			org.dom4j.Document document = reader.read(is);
			
			//获得节点的命名空间
        	String uri = document.getRootElement().element("Body")
					.element("getWeatherbyCityNameResponse").getNamespaceURI();
        	//将uri存入map中
        	HashMap map = new HashMap();
        	map.put("xx", uri);
        	
        	org.dom4j.XPath xpath = DocumentHelper.createXPath("//xx:string");
        	xpath.setNamespaceURIs(map);
        	
        	List list = xpath.selectNodes(document);
        	for(int i=0; i<list.size(); i++){
        		Node node = (Node)list.get(i);//转型为Node
        		System.out.println("hah====="+node.getText());
        		
        		Element e = (Element)list.get(i);//转型为Element
        		System.out.println(e.getText());
        	}
       }
       
       /**
        * 运用jdk中自带包javax.xml.xpath包
        * @throws Exception
        */
       public static void test3()  throws Exception {
       	//将XML文档加载到DOM Document对象中
           DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();   
           factory.setNamespaceAware(true); // never forget this!   
           DocumentBuilder builder = factory.newDocumentBuilder();   
           org.w3c.dom.Document doc = builder.parse("src/books.xml");   
           //创建 XPathFactory
           XPathFactory pathFactory = XPathFactory.newInstance();   
           //使用XPathFactory工厂创建 XPath 对象
           XPath xpath = pathFactory.newXPath();   
           //使用XPath对象编译XPath表达式
           XPathExpression pathExpression = xpath   
                           .compile("//book[author='TEST']/title/text()");   
           //计算 XPath 表达式得到结果
           Object result = pathExpression.evaluate(doc, XPathConstants.NODESET);   
           //节点集node-set转化为NodeList
           //将结果强制转化成 DOM NodeList 
           org.w3c.dom.NodeList nodes = (NodeList) result;   
           for (int i = 0; i < nodes.getLength(); i++) {   
                   System.out.println(nodes.item(i).getNodeValue());   
           }
           //查找所有图书的 XPath 查询非常简单:
           //book[author="TEST"]   
           //book代表节点的名称,author属性的名称,后面是要查询的值  
           
           //为了找出这些图书的标题(title),只要增加一步,表达式就变成了:
           //book[author="TEST"]/title   
           //title代表要取元素的名称  
           
           //最后,真正需要的是 title 元素的文本节点内容.这就要求再增加一步,完整的表达式就是:
           //book[author="TEST"]/title/text()   
           //text()该节点的内容  
       }
       
       public static void main(String[] args) throws Exception{
    	   test1();
    	   //test2();
    	   //test3();
       }   
}

以下是几个XPath讲解的资料:
dom4j中XPath的使用:http://nieli.iteye.com/blog/540720
xpath的数据和节点类型以及XPath中节点匹配的基本方法:http://www.iteye.com/topic/258109
编写简单的XPath程序:http://www.iteye.com/topic/153252
分享到:
评论

相关推荐

    dom4j中xpath的使用

    **DOM4J中XPath的使用** XPath是一种在XML文档中查找信息的语言,它被设计用来在XML文档中导航,寻找节点、属性或者信息。DOM4J是Java中一个非常流行的XML处理库,它提供了对XPath的强大支持。这篇文档将深入探讨...

    dom4j 和xpath

    DOM4J和XPath是XML处理领域中的两个重要概念,它们在Java编程中有着广泛的应用。DOM4J是一款灵活且功能强大的Java库,主要用于处理XML文档,而XPath是一种在XML文档中查找信息的语言。 DOM4J简介: DOM4J是基于Java...

    dom4j及xpath jar包

    要使用DOM4J和XPath,首先需要在项目中引入相应的jar包。提供的压缩包中包含的"dom4j"文件,很可能就是DOM4J库的jar包。通常,还需要一个支持XPath的jar包,如jaxen,它为DOM4J提供了XPath的支持。如果你的描述中...

    DOM4J_xpath

    示例代码展示如何使用DOM4J执行XPath查询: ```java List&lt;Element&gt; elements = root.selectNodes("//book/title"); String title = (String) root.selectSingleNode("//book/title").getText(); ``` 这里使用了`...

    dom4j用到的xpath\dom4j等一系列jar包

    DOM4J库集成了XPath支持,使得在DOM4J中使用XPath查询XML数据变得非常方便。 DOM4J的主要特性包括: 1. **XML解析**:DOM4J提供了多种解析方式,包括DOM、SAX和StAX,以适应不同的性能和内存需求。 2. **文档模型**...

    dom4j_xpath_junitTest.zip

    DOM4J、XPath和JUnit是Java开发中不可或缺的三个重要工具。DOM4J是处理XML文档的一个强大库,XPath则是XML路径语言,用于在XML文档中查找信息,而JUnit则是Java编程语言中的一个单元测试框架。接下来,我们将深入...

    dom4j和xpath帮助文档

    3. **XPath支持**:DOM4J内置了XPath支持,可以方便地通过XPath表达式选取XML文档中的任意节点。 4. **文档操作**:DOM4J提供了丰富的API来操作XML文档,包括元素、属性、文本、注释、处理指令等。 5. **命名空间...

    Dom4j结合XPath解析XML文件路径表达式

    在Dom4j中,我们可以使用`org.dom4j.XPath`类来创建XPath对象,并通过`selectNodes()`或`selectSingleNode()`方法来执行路径表达式,获取XML文档中的节点集合或单个节点。以下是一个简单的示例: ```java import ...

    dom4j及xpath基础应用

    DOM4J和XPath是Java开发中处理XML文档的两个重要工具。在本文中,我们将深入探讨它们的基本概念、功能以及如何在实际项目中运用。 **DOM4J简介** DOM4J是一个非常灵活且功能强大的Java XML API,它提供了丰富的接口...

    Dom4j 、XPath解析Xml所需的jar包和dom4j API

    在Java编程中,解析XML文档通常需要借助库,如DOM4J和XPath。DOM4J是一个灵活且功能强大的开源Java XML API,它提供了XML的读取、写入、修改和遍历等功能。XPath则是W3C标准中的一个查询语言,用于在XML文档中查找...

    dom4j,Xpath等全家庭打包

    `dom4j API .chw`和`.chm`文件是DOM4J的API帮助文档,提供详细的类和方法说明,开发者可以通过这些文档了解DOM4J的具体使用方法。 XPath是XML路径语言,它提供了一种在XML文档中查找信息的标准方式。XPath通过...

    dom4j基础入门文档(SAX,DOM,XPATH)

    16. `org.dom4j.XPath`: 提供XPath表达式的解析和评估,用于快速定位XML文档中的节点。 二、读取和解析XML文档 dom4j提供了两种主要的XML解析方式:DOMReader和SAXReader。DOMReader基于W3C DOM,将整个XML文档...

    [转]学习:Dom4j和Xpath

    Dom4j提供了一个易于使用的API,用于构建、修改和解析XML文档,而XPath则为在文档中高效地定位和选取节点提供了简洁的语言。两者结合使用,可以极大地提高XML处理的效率和灵活性。在实际开发中,了解并熟练运用这...

    Dom4J采用XPath操纵XML教程及例子

    本教程将重点介绍如何使用Java中的Dom4J库,结合XPath来高效地操作XML。 首先,让我们了解Dom4J库。Dom4J是Java社区中一个非常流行的处理XML的开源库,它提供了灵活且高效的API,支持XML的读取、写入、修改等多种...

    DOM4J jar包和W3CSchool.chm的文档包含XPath的教程

    Jaxen使XPath查询在不同的XML解析器之间具有可移植性,因此即使在DOM4J中使用XPath,也可以通过Jaxen调用其他解析器的实现。 "W3CSchool.chm"文档是一个经典的在线编程学习资源,其中的XPath教程可能包含了XPath的...

    使用Maven管理项目,实现DOM4j操作XML文件

    在本示例中,"sendXmlPersist"可能是演示程序的主类或测试用例,它展示了如何使用DOM4j和Maven配合工作。具体步骤可能包括以下几步: 1. **引入DOM4j依赖**:在`pom.xml`文件中,添加DOM4j的依赖项,这样Maven会在...

    dom4j详细使用用法

    #### 三、DOM4j基本使用方法 1. **读取并解析XML文档** 要读取并解析XML文档,可以使用`org.dom4j.io`包中的`SAXReader`类。`SAXReader`是一个轻量级的解析器,适用于大型文档,因为它不会一次性将整个文档加载到...

    Dom4j 解析Xml文档及 XPath查询 学习笔记

    在Dom4j中,使用`XPath`类进行查询。 1. **创建XPath对象**:首先,需要创建一个`XPath`对象,通常通过`DocumentHelper.createXPath()`方法实现。 ```java XPath xpath = DocumentHelper.createXPath("//element[@...

    dom4j_dom4j1.6.1安装包_

    DOM4J的使用方法非常直观。例如,你可以使用以下代码创建一个新的XML文档: ```java DocumentFactory factory = DocumentFactory.getInstance(); Document document = factory.createDocument(); Element root...

Global site tag (gtag.js) - Google Analytics