dom4j使用XPath解析XML返回null的解决方法

使用XPath解析XML的时候,在基本代码没有写错的情况下,使用selectSingleNode()方法获取xml的内容时返回null值,很有可能是因为xml设置了命名空间。

1)在没有命名空间的情况下,book.xml的文件(文件位于src/cn/edu/gdut/web/xpath下)内容如下:



	
		thinking in java
		Bruce Eckel
		108
	
	
		c primer plus
		Stephen Prata
		89
	

假如需要获取第一个book下的name,步骤如下:

首先创建SAXReader对象的一个实例saxReader,其次利用saxReader调用方法read()访问xml的地址得到Document对象的一个实例doc,然后利用doc调用方法selectSingleNode()来读取第一个book的name。代码实现如下:

package cn.edu.gdut.web.xpath;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.Test;
import java.util.*;

public class TestXPath {
	
	@Test
	public void testNoNameSpace() throws DocumentException {
		SAXReader saxReader = new SAXReader();
		Document doc = saxReader.read("src/cn/edu/gdut/web/xpath/book.xml");
		Node node = doc.selectSingleNode("/books/book[1]/name");
		System.out.println(node.getText());
	}
	
}

2)但是当为xml添加了命名空间以后,book.xml文件内容如下:



	
		thinking in java
		Bruce Eckel
		108
	
	
		c primer plus
		Stephen Prata
		89
	

我们再使用之前上面的代码获取第一个book的name时,会返回一个null值,此时我们就应该对xpath进行预处理,步骤如下:

首先应该创建SAXReader对象的一个实例saxReader;其次把xml的namespace内容存放到Map中;然后把map的内容作为namespace的路径(我这里的namespace是http://www.gdut.edu.cn),此步骤主要是利用saxReader调用getDocumentFactory()方法,随之再调用setNameSpaceURIs()方法,将map添加进去;随后使用saxReader调用read()方法获得Document对像的一个实例doc,最后利用doc调用selectSingleNode()获取一个Node对象实例node,在使用select·SingleNode()方法时,所有节点需要在前面加上map的key值(这里我使用的是gdut),代码实现如下:

package cn.edu.gdut.web.xpath;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.Test;
import java.util.*;

public class TestXPath {
	
	@Test
	public void testNameSpace() throws DocumentException {
		SAXReader saxReader = new SAXReader();
		Map map = new HashMap();
		map.put("gdut", "http://www.gdut.edu.cn");
		saxReader.getDocumentFactory().setXPathNamespaceURIs(map);
		Document doc = saxReader.read("src/cn/edu/gdut/web/xpath/book.xml");
		Node node = doc.selectSingleNode("/gdut:books/gdut:book[1]/gdut:name");
		System.out.println(node.getText());
	}
	
}


你可能感兴趣的:(Java)