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

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

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

<?xml version="1.0" encoding="UTF-8"?>
<books>
	<book>
		<name>thinking in java</name>
		<author>Bruce Eckel</author>
		<price>108</price>
	</book>
	<book>
		<name>c primer plus</name>
		<author>Stephen Prata</author>
		<price>89</price>
	</book>
</books>

假如需要获取第一个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文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<books xmlns="http://www.gdut.edu.cn">
	<book>
		<name>thinking in java</name>
		<author>Bruce Eckel</author>
		<price>108</price>
	</book>
	<book>
		<name>c primer plus</name>
		<author>Stephen Prata</author>
		<price>89</price>
	</book>
</books>

我们再使用之前上面的代码获取第一个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<String, String> map = new HashMap<String, String>();
		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());
	}
	
}


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值