从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的网站上已经说得很清楚了,不过我建议大家不要玩的太深了,够用即可啦!否则很容易走火入魔哦!嘿嘿~