apache commons configuration 学习(二)

从configuration学习(一)中我们学会了如何使用configuration来进行基本的配置文件操作,但是对于比较复杂的配置文件,有些操作还无法实现,比如请看下面的xml配置文件:

database.xml

<?xml version="1.0" encoding="UTF-8" ?>

<database>
  <tables>
    <table tableType="system">
      <name>users</name>
      <fields>
        <field>
          <name>uid</name>
          <type>long</type>
        </field>
        <field>
          <name>email</name>
          <type>java.lang.String</type>
        </field>
      </fields>
    </table>
    <table tableType="application">
      <name>documents</name>
      <fields>
        <field>
          <name>docid</name>
          <type>long</type>
        </field>
        <field>
          <name>creationDate</name>
          <type>java.util.Date</type>
        </field>       
      </fields>
    </table>
  </tables>
</database>

 这份配置文件中,一个tables标签包含多个table标签,其下又包含子标签name和fields,fields标签中又包含了多个field标签,下那也有name元素,那么我们要如何来获取特定的name?别无他法,只有通过遍历了。请见代码:

 ConfigurationDemo_01.java

package com.william.configuration;

import java.util.Iterator;
import java.util.List;

import org.apache.commons.configuration.*;

public class ConfigurationDemo_01
{
	public static void main(String args[])
	{
		try
		{
			 // 加载配置文件
			XMLConfiguration config = new XMLConfiguration("database.xml");
			
			List<String> nameList = null;
			Iterator<String> iter = null;
			
			// 获取table标签的直接子元素name
			nameList = config.getList("tables.table.name");
			iter = nameList.iterator();
			while(iter.hasNext())
			{
				System.out.println(iter.next());
			}			
			System.out.println("==================");
			
			// 获取field标签的直接子元素name
			nameList = config.getList("tables.table.fields.field.name");
			iter = nameList.iterator();
			while(iter.hasNext())
			{
				System.out.println(iter.next());
			}			
		} 
		catch (ConfigurationException e)
		{
			e.printStackTrace();
		}
	}
}

 

执行结果:

users
documents
==================
uid
email
docid
creationDate

 

OK,通过上面的代码我们知道了如何获取配置文件元素列表。假如我只想获取第一个table元素下的field中的name集合呢?没问题,这样写就行了:

nameList = config.getList("tables.table(0).fields.field.name");

 

很简单吧,这里要注意引用越界问题,如果我们不小心写成了config.getList("tables.table(2).fields.field.name"); 实际上这里只有两个table,那么这样会返回一个null值,所以如果要对值进行后续的操作就得进行空置判断了。

 

另外还有一种方式,我们可以先将一段配置赋予一个子节点配置类,然后通过子节点配置类来进行其他操作:

SubnodeConfiguration sub = config.configurationAt("tables.table(0)");
String tableName = sub.getString("name");  
List fieldNames = sub.getList("fields.field.name");
......

 

如果获取的是多个子元素,可以这样操作:

List fields = config.configurationsAt("tables.table(0).fields.field");
    for(Iterator it = fields.iterator(); it.hasNext();)
    {
        sub = (SubnodeConfiguration) it.next();			  
        String fieldName = sub.getString("name");
        String fieldType = sub.getString("type");
        ......

 

 嗯,这样已经可以满足我们大部分需求了,当然,还可以更深一步,比如配置文件的标签中有"."怎么办?比如我想将索引以{0}这样的方式引用怎么办?当然是有方法的,apache的网站上已经说得很清楚了,不过我建议大家不要玩的太深了,够用即可啦!否则很容易走火入魔哦!嘿嘿~

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值