dom4j中 selectSingleNode 或selectNodes获取不到节点的原因总结 (转)

时间:2023-03-08 16:20:42
dom4j中 selectSingleNode 或selectNodes获取不到节点的原因总结 (转)

没想到搞个dom4j会出这么多怪错。。

最近在研究XBRL GL的有关内容,在项目中要求吧XBRL GL导入到11179注册库中,根据11179建立数据库,然后从XBRL GL分类标准中导入数据到数据库。在导入过程中需要用到dom4j来读取XBRL GL文件,用selectnodes来选取制定的元素,发现总是空值,查看XPATH也没有错,着实困扰了很长时间。后来发现,原来是xmlns在作怪, 把xml文件开头的xmlns属性去掉,一切OK!

另外,如果要选取当前节点的子节点,要用"./节点的相对路径"才能完成此任务。

可能是因为XML文件带有命名空间.比如
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

因为dom4j不能识别带命名空间的节点,所以在读取带命名空间的XML时,要在每个节点前加上命名空间,方法如下例子:

Document doct=reader.read(xmlFile);
                                        HashMap nsMap=new HashMap();
                                        nsMap.put("ns","http://java.sun.com/xml/ns/jbi");          //加入命名空间
                                        //获取子节点
                                        XPath xsub=doct.createXPath("//ns:title");
                                        xsub.setNamespaceURIs(nsMap);
                                        Element element = (Element) xsub.selectSingleNode(doct);

参考
dom4j解析带命名空间的xml文件的节点的例子,只要给XPath设置默认的命名空间就行了