apache commons configuration 学习(三)

前面的学习让我们学会了如何通过configuration框架来读取配置文件,但是还有一个重要的内容没有学习,就是如何来更新配置文件里面的值呢?Configuration接口提供了一个setProperty(String key,Object value)的方法供我们调用,这个方法看起来简单,明了,但是,如果你没有去认真测试一番的话,这里面包含了很多的地雷哦~!不相信?就让我们来看一些例子:

database.xml:

<?xml version="1.0" encoding="UTF-8"?>
<database>
<tables>
    <table tableType="system">
      <name>name</name>
      <fields>
        <field>
          <name>uid</name>
         <type>long,short</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>

 

然后我想干什么呢?我想把第一个table下的name元素的值改为changed_name,我采取这样的方法:

 

XMLConfiguration config = new XMLConfiguration("database.xml");

// 设置修改自动提交
config.setAutoSave(true);
config.setProperty("tables.table(0).name", "changed_name");

OK,没问题,我看到name已经变为了“changed_name”,蛮不错的!千万别高兴得太早,不知道你注意到了没有,在database.xml文件中有一个配置:<type>long,short</type>,经过以上的操作后,竟然被分解成了两个“<type>”标签,就像下面的一样:

......
<type>long</type>
<type>short</type>
......

 

这可真够恼人的,改一个属性竟然把文件的结构都改变了,那还不得出大问题!什么原因?原来Configuration框架对于一个配置项中的元素,如果是用“,”分隔的,它会把他们加载成为一个List,像上面的type配置,long和short是以“,”分隔的,configuration把他们认为是两个标签type(0)和type(1),而更新的时候它则把所有的List还原成xml标签了!怎么办?没问题,只需要调用XMLConfiguration.setsetDefaultListDelimiter()方法就行了,这是一个静态方法,这个方法一定要在加载配置文件之前调用,否则不会起作用。

// 这一行代码必须在下面一行代码前,否则不会起作用
XMLConfiguration.setDefaultListDelimiter('/');
XMLConfiguration xmlConfig = new XMLConfiguration("database.xml");
xmlConfig.setAutoSave(true);
......

  

如果你觉得这样子看起来不太舒服,还有另外一种方式:

// 使用空的构造函数
XMLConfiguration config = new XMLConfiguration();

// 设置配置分割符,需要在加载之前调用
config.setListDelimiter('/');
config .setAutoSave(true);
config .setFileName("database.xml");
config .load();
......

 

配置了默认的List分割符之后,第一个地雷被我们挖走了。

 

第二个地雷,上面的配置文件第一个table下只有一个直接的name子元素,如果2个、3个或是n个呢?这样的话,当你进行更新操作时,Configuration会无情的把后面的全部cut掉,所以你必须指定序号,像这样:

config.setProperty("tables.table(0).name(0)", "changed_name");

 

添加元素的时候也是一样,首先需要配置好配置了默认的List分割符,不要与你添加元素中含有的符号重合了,否则会被添加多个元素。xml配置文件添加元素基本操作:

// 在第一个table下添加Addr标签,并添加provice和city子标签
// 索引(-1)总是会在上级元素末尾创建新元素,而没有索引时会指向最后一个元素
config.addProperty("tables.table(0).Addr(-1).province", "Guangdong");
config.addProperty("tables.table(0).Addr.city", "Shenzhen");

更新后的database.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<database>
<tables>
    <table tableType="system">
      <name>changed_name</name>
      <fields>
          ......
       </fields>
       <Addr>
          <province>Guangdong</province>
          <city>Shenzhen</city>
       </Addr>
    </table>
    <table tableType="application">
     ......
    </table>
  </tables>
</database>

  

你可能感兴趣的:(apache,xml,框架)