使用commons的Configuration读取XML

前端之家收集整理的这篇文章主要介绍了使用commons的Configuration读取XML前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. <?xml version="1.0" encoding="ISO-8859-1" ?>
  2. <gui-definition>
  3. <colors>
  4. <background>#808080</background>
  5. <text>#000000</text>
  6. <header>#008000</header>
  7. <link normal="#000080" visited="#800080"/>
  8. <default>${colors.header}</default>
  9. </colors>
  10. <rowsPerPage>15</rowsPerPage>
  11. <buttons>
  12. <name>OK,Cancel,Help</name>
  13. </buttons>
  14. <numberFormat pattern="###\,###.##"/>
  15. </gui-definition>
以上是个很简单的XML,首先肯定是把这个文件载入(就把上面这个文件命名为table.xml吧)
  1. try
  2. {
  3. XMLConfiguration config = new XMLConfiguration("tables.xml");
  4. // do something with config
  5. }
  6. catch(ConfigurationException cex)
  7. {
  8. // something went wrong,e.g. the file was not found
  9. }


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

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

  1. 下面说明下需要注意的几个地方:
  2. 1.首先根元素是被忽略的,在上面的例子中不是写gui-definition.colors.text,而是写成colors.text
  3. 2.使用“.”符号访问子元素。在上面的例子中访问<colors>元素中的<text>,对应的keycolors.text
  4. 3.访问元素属性方法类似XPath方法
  5. 4.返回的是list的元素,可以用getList()方法。就像上面例子中的buttons.name内容"OK,Help",用getList()
  6. 方法返回的是3个元素组成的List。这里的分隔符是“,”,可以通过setDefaultDelimiter()方法进行指定。
  7. 5.可以操作propertiesConfiguration,就像是例子中的<default>元素。setDefaultDelimiter
  1. 上面是个最简单的XML格式,但是还有些相对复杂的XML,如下:
  1.  
  1. <?xml version="1.0" encoding="ISO-8859-1" ?>
  2. <database>
  3.   <tables>
  4.     <table tableType="system">
  5.       <name>users</name>
  6.       <fields>
  7.         <field>
  8.           <name>uid</name>
  9.           <type>long</type>
  10.         </field>
  11.         <field>
  12.           <name>uname</name>
  13.           <type>java.lang.String</type>
  14.         </field>
  15.         <field>
  16.           <name>firstName</name>
  17.           <type>java.lang.String</type>
  18.         </field>
  19.         <field>
  20.           <name>lastName</name>
  21.           <type>java.lang.String</type>
  22.         </field>
  23.         <field>
  24.           <name>email</name>
  25.           <type>java.lang.String</type>
  26.         </field>
  27.       </fields>
  28.     </table>
  29.     <table tableType="application">
  30.       <name>documents</name>
  31.       <fields>
  32.         <field>
  33.           <name>docid</name>
  34.           <type>long</type>
  35.         </field>
  36.         <field>
  37.           <name>name</name>
  38.           <type>java.lang.String</type>
  39.         </field>
  40.         <field>
  41.           <name>creationDate</name>
  42.           <type>java.util.Date</type>
  43.         </field>
  44.         <field>
  45.           <name>authorID</name>
  46.           <type>long</type>
  47.         </field>
  48.         <field>
  49.           <name>version</name>
  50.           <type>int</type>
  51.         </field>
  52.       </fields>
  53.     </table>
  54.   </tables>
  55. </database>
    像上面例子中用tables.table.name key去取得表格的名字,返回的是什么类型呢?因为tables.table.name中的table和name
  56. 有两个地方都出现了。其实返回的是个Collection,
  57. Object prop = config.getProperty("tables.table.name");
  58. if(prop instanceof Collection)
  59. {
  60. 	System.out.println("Number of tables: " + ((Collection) prop).size());
  61. }
    其实也可以用getList()方法来操作,这里如果你只想得到第一个tables.table.name,需要使用getString()方法就可以了。
    还有另外一个问题我们可以用getList()方法取到tables.table.fields.field.name,但是其实这些filed.name并不是属于同
    一个table,这样的话,就需要使用如下的方法
  1. List fields = config.configurationsAt("tables.table(0).fields.field");
  2. for(Iterator it = fields.iterator(); it.hasNext();)
  3. {
  4.     HierarchicalConfiguration sub = (HierarchicalConfiguration) it.next();
  5.     // sub contains now all data about a single field
  6.     String fieldName = sub.getString("name");
  7.     String fieldType = sub.getString("type");
  8.     ...
    第一行中是使用configurationsAt方法是为了,省略在下面子元素前全路径。在实际应用中可能不一定会直接指定table(0),这可以结合上面的Object prop = config.getProperty("tables.table.name")进行迭代。

猜你在找的XML相关文章