使用commons的Configuration读取XML

<?xml version="1.0" encoding="ISO-8859-1" ?>
<gui-definition>
  <colors>
    <background>#808080</background>
    <text>#000000</text>
    <header>#008000</header>
    <link normal="#000080" visited="#800080"/>
    <default>${colors.header}</default>
  </colors>
  <rowsPerPage>15</rowsPerPage>
  <buttons>
    <name>OK,Cancel,Help</name>
  </buttons>
  <numberFormat pattern="###\,###.##"/>
</gui-definition>
以上是个很简单的XML,首先肯定是把这个文件载入(就把上面这个文件命名为table.xml吧)
try
{
XMLConfiguration config = new XMLConfiguration("tables.xml");
// do something with config
}
catch(ConfigurationException cex)
{
// something went wrong, e.g. the file was not found
}


如果导入的时候没有异常的话,config对象就可以使用了,读取的方法如下:
 

String backColor = config.getString("colors.background");
String textColor = config.getString("colors.text");
String linkNormal = config.getString("colors.link[@normal]");
String defColor = config.getString("colors.default");
int rowsPerPage = config.getInt("rowsPerPage");
List buttons = config.getList("buttons.name");

下面说明下需要注意的几个地方:
1.首先根元素是被忽略的,在上面的例子中不是写gui-definition.colors.text,而是写成colors.text。
2.使用“.”符号访问子元素。在上面的例子中访问<colors>元素中的<text>,对应的key是colors.text。
3.访问元素属性的方法类似XPath的方法。
4.返回的是list的元素,可以用getList()方法。就像上面例子中的buttons.name的内容是"OK,Cancel,Help",用getList()
方法返回的是3个元素组成的List。这里的分隔符是“,”,可以通过setDefaultDelimiter()方法进行指定。
5.可以操作propertiesConfiguration,就像是例子中的<default>元素。
上面是个最简单的XML格式,但是还有些相对复杂的XML,如下:

<?xml version="1.0" encoding="ISO-8859-1" ?>

<database>
  <tables>
    <table tableType="system">
      <name>users</name>
      <fields>
        <field>
          <name>uid</name>
          <type>long</type>
        </field>
        <field>
          <name>uname</name>
          <type>java.lang.String</type>
        </field>
        <field>
          <name>firstName</name>
          <type>java.lang.String</type>
        </field>
        <field>
          <name>lastName</name>
          <type>java.lang.String</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>name</name>
          <type>java.lang.String</type>
        </field>
        <field>
          <name>creationDate</name>
          <type>java.util.Date</type>
        </field>
        <field>
          <name>authorID</name>
          <type>long</type>
        </field>
        <field>
          <name>version</name>
          <type>int</type>
        </field>
      </fields>
    </table>
  </tables>
</database>
像上面例子中用tables.table.name key去取得表格的名字,返回的是什么类型呢?因为tables.table.name中的table和name
有两个地方都出现了。其实返回的是个Collection,
Object prop = config.getProperty("tables.table.name");
if(prop instanceof Collection)
{
	System.out.println("Number of tables: " + ((Collection) prop).size());
}
其实也可以用getList()方法来操作,这里如果你只想得到第一个tables.table.name,需要使用getString()方法就可以了。
还有另外一个问题我们可以用getList()方法取到tables.table.fields.field.name,但是其实这些filed.name并不是属于同
一个table,这样的话,就需要使用如下的方法:
List fields = config.configurationsAt("tables.table(0).fields.field");
for(Iterator it = fields.iterator(); it.hasNext();)
{
    HierarchicalConfiguration sub = (HierarchicalConfiguration) it.next();
    // sub contains now all data about a single field
    String fieldName = sub.getString("name");
    String fieldType = sub.getString("type");
    ...

第一行中是使用configurationsAt的方法是为了,省略在下面子元素前全路径。在实际应用中可能不一定会直接指定table(0),这可以结合上面的Object prop = config.getProperty("tables.table.name")进行迭代。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值