关于dom4j在解析拥有命名空间xmlns时,无法解析的问题

 
                                           关于dom4j在解析拥有命名空间xmlns时,无法解析的问题

在一个birt开发的项目中,遇到了解析birt生成的xml报表文件的情况,于是决定用dom4j来解决.[需要下载dom4j.jar,jaxen-1.1-beta-10.jar]这两个类库.一开始还忘记了加入jaxen造成了错误.
xml代码example:
< report   xmlns ="http://www.eclipse.org/birt/2005/design"  version ="3.2.15"  id ="1" >
    
< list-property  name ="cssStyleSheets" >
        
< structure >
            
< property  name ="fileName" > D: eport.css property >
        
structure >
    
list-property >
report >
我按照dom4j一般的解析方式进行了编码:
public   class  TransferXML  {
    
public static void main(String[] args) throws Exception{
        SAXReader saxReader 
= new SAXReader();
        File file 
= new File("D:/test.xml");
        Document document 
= saxReader.read(file);
        List tmp 
= document.selectNodes("//list-property");
        System.out.println(tmp.size());
    }

}
结果输出为0.并不是我预想中的1.
而且代码比较简单,应该不存在问题.然后,我又找了一个不同的xml文件,结果能够成功找到node.
用比较工具对2个xml文件进行了compare.结果只是存在xmlns的区别.一个有一个没有.faint......
查找了相关资料,网上,或者api等等.考虑出了2个解决方案.其中第一个为从网上搜取到的,姑且写在这里,只是个参考(千万别告我,怕怕的说).
第一个方案.
public   class  TransferXML  {
    
public static void main(String[] args) throws Exception{
        Map map 
= new HashMap();
        map.put(
"design","http://www.eclipse.org/birt/2005/design");
        SAXReader saxReader 
= new SAXReader();
        File file 
= new File("D:/test.xml");
        Document document 
= saxReader.read(file);
        XPath x 
= document.createXPath("//design:list-property");
        x.setNamespaceURIs(map);
        List nodelist 
= x.selectNodes(document);
        System.out.println(nodelist.size());
    }

}
第二个解决方案:
public   class  TransferXML  {
    
public static void main(String[] args) throws Exception{
        Map map 
= new HashMap();
        map.put(
"design","http://www.eclipse.org/birt/2005/design");
        SAXReader saxReader 
= new SAXReader();
        File file 
= new File("D:/test.xml");
        saxReader.getDocumentFactory().setXPathNamespaceURIs(map);
        Document document 
= saxReader.read(file);
        List tmp 
= document.selectNodes("//design:list-property");
        System.out.println(tmp.size());
    }

}
相较而言,我还是比较倾向于第二种方法.
如果你们有更好的方法,可以跟我留下.仅供参考.

你可能感兴趣的:(XML,Schema)