您的位置:首页 > 其它

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

2017-04-20 11:21 585 查看
使用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),代码实现如下:

<
93a2
/p>
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());
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: