dom4j解析xml基本方法以及当xml中存在命名空间时的三种处理办法

使用SAXReader需要导入dom4j-full.jar包。

     dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。

     使用举例:

1.    s.xml内容

  1. <?xml version="1.0" encoding="GB2312"?>  
  2. <data>  
  3.     <row queryDTO.enterpriseId="gfd" queryDTO.loginName="gdfg" queryDTO.state="0"/>  
  4. </data>  

 

2.解析

[c-sharp] view plain copy print ?

import java.io.File;  

import java.io.FileInputStream;  

import java.io.FileNotFoundException;  

import java.util.Iterator;  

import java.util.List;  

import org.dom4j.Document;  

import org.dom4j.DocumentException;  

import org.dom4j.Element;  

import org.dom4j.io.SAXReader;  

import org.dom4j.tree.AbstractAttribute;  

  

public class ReadXMLTest {  

      

    public static void main(String[] args){  

        File xmlFile = new File("C:/s.xml");  

        FileInputStream fis = null;  

        try {  

            fis = new FileInputStream(xmlFile);  

        } catch (FileNotFoundException e) {  

            e.printStackTrace();  

            System.err.println("File is not exsit!");  

        }  

          

        SAXReader saxReader = new SAXReader();  

        List rowList = null;  

        try {  

            //生成文档对应实体   

            Document doc = saxReader.read(fis);  

            //获取指定路径下的元素列表,这里指获取所有的data下的row元素   

            rowList = doc.selectNodes("//data/row");  

        } catch (DocumentException e) {  

            e.printStackTrace();  

        }  

          

          

        for(Iterator iter = rowList.iterator();iter.hasNext();){  

            //获得具体的row元素    

            Element element = (Element)iter.next();  

            //获得row元素的所有属性列表   

            List elementList = element.attributes();  

            for(Iterator iter1 = elementList.iterator();iter1.hasNext();){  

                //将每个属性转化为一个抽象属性,然后获取其名字和值   

                AbstractAttribute aa = (AbstractAttribute)iter1.next();  

                System.out.println("Name:"+aa.getName()+";Value:"+aa.getValue());  

            }  

                            //输出:   

                            //Name:queryDTO.enterpriseId;Value:gfd   

                            //Name:queryDTO.loginName;Value:gdfg   

                            //Name:queryDTO.state;Value:0   

           System.out.println(element.getName());  

                            //输出:   

                            //row   

            // 取得row元素的queryDTO.enterpriseId属性的值   

            System.out.println(element.attributeValue("queryDTO.enterpriseId"));  

                            //输出:   

                            //gfd   

            //如果element下有子元素,(类似width="**"),要想获得该子元素的值,可以用如下方法   

            System.out.println(element.elementText("width"));//因为没有,所以输出为null。   

        }  

          

    }  

}  

 

 

当你解析XML时,是否会因为命名空间的存在而不能得偿所愿呢?
.net上的解决方法我就不多说了(.net有世界上最详细的开发文档。这是我最欣赏微软的地方
java方面,好多人推荐用dom4j处理xml,我也就说说在dom4j上处理带命名空间的xml

先说前两个方法,是从网上看来的。(来自
http://blog.csdn.net/anyoneking/)摘抄如下:
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>

第一个方案.设置你的xpath的命名空间setNamespaceURIs

 

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());
    }
}

第二个解决方案:设置你的DocumentFactory()的命名空间 setXPathNamespaceURIs

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());
    }
}

第三种方法:本人用的,最笨也是最通用的方法,就是不使用开发环境给你提供的一系列对象,而是用XPath语法中自带的local-name() 和 namespace-uri() 指定你要使用的节点名和命名空间。
当你遇到使用xslt来样式化xml时,就知道这个笨方法的好处了:

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("//*[local-name()='report' and namespace-uri()='http://www.eclipse.org/birt/2005/design']/* [local-name()='list-property']"
);
        System.
out
.println(tmp.size());
    }
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随与博主沟通,第一间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值