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下)内容如下:
假如需要获取第一个book下的name,步骤如下:
首先创建SAXReader对象的一个实例saxReader,其次利用saxReader调用方法read()访问xml的地址得到Document对象的一个实例doc,然后利用doc调用方法selectSingleNode()来读取第一个book的name。代码实现如下:
2)但是当为xml添加了命名空间以后,book.xml文件内容如下:
我们再使用之前上面的代码获取第一个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>
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()); } }
相关文章推荐
- dom4j 使用xpath 解析 persistence.xml 出现xmlns后不能解析问题解决
- dom4j使用XPath解析xml
- 使用DOM4J解析XML文档,以及使用XPath提取XML文档
- 使用mybatis操作mysql数据库SUM方法返回NULL解决
- jsp返回xml浏览器解析错误问题解决方法
- java使用xpath和dom4j解析xml
- 使用HttpClient进行http post/get方法的调用,以及使用dom4j解析xml
- 使用dom4j和XPath解析XML之例子一
- Python使用XPATH解析特定结构XML文件速度提升方法
- 解决IE中无法使用jquery.find方法解析xml字符串的方法
- dom4j中使用xpath解析带命名空间的xml文件,取不到节点的解决办法
- java使用dom4j和XPath解析XML与.net 操作XML小结
- 使用DOM4J解析XML文档,以及使用XPath提取XML文档
- 使用HttpClient进行http post/get方法的调用,以及使用dom4j解析xml
- ajax中调用responseXML总返回null而调用responseText却返回不为空的解决方法
- SkinMagic使用后按钮加自定义图标或菜单GetMneu返回NULL的解决方法
- 使用dom4j和XPath解析XML之例子二
- 转: dom4j中使用xpath解析带命名空间的xml文件,取不到节点的解决办法
- 使用DOM4J解析XML及采用Schema校验的方法
- 使用dom4j和XPath解析XML之例子二