没想到搞个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设置默认的命名空间就行了