JDOM解析XML文件

JDOM解析XML文件发表于:2008年3月28日 8时44分54秒阅读(3)评论(0)本文链接:http://user.qzone.qq.com/59757282/blog/1206665094 


 
JDOM解析XML文件
JDOM是利用JAVA解析XML的工具包。 
JAVA中很多配置文件都是以XML形式存在的。这样就避免不了需要程序员去解析它, 
下面就是我最近项目中对XML解析的一个小小总结,希望能对大家有所帮助!(音乐该起了,掌声也该响起来了哦!) 
首先介绍一下项目背景,该项目是给公安部门使用的协同办案系统,可以使用多个身份的公安系统,介于每个省份需求不一样又避免重复的开发, 
同时也为了日后维护方便,这个版本的系统在设计初期就有一个基本主线就是可配置性。包括权限的配置,菜单的配置,功能点的配置……这样就涉及 
到需要解析很多XML文件。 
  想必很多JAVA程序员都用使用过XML配置文件(如果没有使用过的以下内容可以不用看了,请直接跳过,谢谢!)比如Hibernate,Spring等流行框架都 
是基于XML配置的。这里就不在多说关于XML规则方面的东西了,直接看一个简单的实例: 
<?xml version="1.0" encoding="UTF-8"?> 
<operations> 
<!--省略若干其配置--> 
<operation name="BG_CQJCKYYJDBBGS"> 
<action>jckyyjdbAction</action> 
<create>/dcqz/jckyyjdb/jckyyjdb.jsp</create> 
<update>/dcqz/jckyyjdb/jckyyjdb.jsp</update> 
<redo>/dcqz/jckyyjdb/jckyyjdb.jsp</redo> 
<entity>com.gnt.xtba.entity.XtbaZccs</entity>  具体业务的实体类 
<fields>saryid</fields>                   业务POJO中人员或者组织ID的属性字段 
<lb>ry</lb>                            人员或者组织类别(只有两种选择,RY或者ZZ。业务只涉及人员的统一用RY,既涉及人员又涉及组织的统一使用ZZ。切忌不能写成RY,ZZ)   
</operation> 
<!--省略若干其配置--> 
<operations> 
说明:截取一部分XML, 
我们现在要解析operation.xml相对路径为/conf/report/operation.xml。解析的目的:根据指定的name得到具体的entity,取得其中指定的fields的值。 
代码如下: 
//代码中用到的RyzzwhEntity为定义的需要解析子节点组成的VO,这里就不需要公布代码了吧。 
public class Test(){ 
  private  Map operationMap =new HashMap(); 
private String path="/conf/report/operation.xml";     
public Collection getAll() { 
  if(operationMap.isEmpty()){ 
   this.load(); 
  } 
  return operationMap.values(); 

public RyzzwhEntity getRyzzwhEntity(String name) { 
  if(operationMap.isEmpty()){ 
   load(); 
  } 
  RyzzwhEntity ryzz = (RyzzwhEntity)operationMap.get(name); 
  if(ryzz==null){ 
   throw new ServiceException(name+"没有配置,配置路径"+path); 
  } 
  return ryzz; 

   private synchronized void load(){ 
     InputStream in = null; 
     try{ 
      ClassLoader loader = Thread.currentThread().getContextClassLoader();   
      in = loader.getResourceAsStream(path); 
     }catch(Exception e){ 
      throw new ServiceException("配制文件没有找到:"+path); 
     } 
  if(in==null) 
   throw new ServiceException("配制文件没有找到:"+path); 
  SAXBuilder builder = new SAXBuilder(false);                  //构造JDOM默认的XML解析器 
  try{ 
   Document doc = builder.build(in);              //得到Document,我们以后要进行的所有操作都是对这个Document操作的.             
   Element operations = doc.getRootElement();     //得到根节点 
   List operationList = operations.getChildren("operation");     //得到根节点下面名为operation的子节点的集合 
   for(Iterator it = operationList.iterator();it.hasNext();){    //遍历 
    Element operation = (Element)it.next(); 
    String name = operation.getAttributeValue("name");          //得到名为指定参数的 值 
    if(name!=null){ 
     name = name.trim().toUpperCase();        //具体业务相关的,不需要多加考虑 
    }else 
     continue; 
    RyzzwhEntity ryzz = new RyzzwhEntity(); 
    ryzz.setName(name); 
    ryzz.setEntity(operation.getChildTextTrim("entity"));            //得到具体的值赋给VO。 
    ryzz.setFields(operation.getChildTextTrim("fields")); 
    ryzz.setLb(operation.getChildTextTrim("lb")); 
    operationMap.put(name, ryzz);                                   //用MAP维护VO,KEY值为传入的NAME 
   } 
   in.close();                                                      //记得关闭流 
  }catch(Exception e){ 
   e.printStackTrace(); 
  } 
    } 
public void reload() { 
  operationMap.clear(); 


最后总结如下: 
1、使用JDOM要先指定解析器,如:SAXBuilder builder=new SAXBuilder(false); 这表示使用的是默认的解析器 
2、得到Document对象。 
3、根据Document得到根节点。如:Element element = org.jdom.Document.getRootElement(); 
4、得到根节点下面所有子节点的集合 List list = element.getChildren(String name); 得到指定那么的集合 
5、遍历(大家都知道这里就不多讲了) 
6、取子节点的属性或者子节点包含的元素   
       属性的取法:org.jdom.Element.getAttributeValue(指定的名字); 
       包含的子元素的取法:org.jdom.Element.getChildTextTrim(指定的名字); 
7、修改值(这里就不介绍,需要指出,修改完了要通过XMLOUTPUTTER.OUTPUT(DOCUMENT,new FileOutputStream(xmlpath))保存到XML,不然只是修改了DOCUMENT对象) 
8、关闭流 
以上拙见,请大家批评指正!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值