qiyadeng

          專注于Java示例及教程
          posts - 84, comments - 152, trackbacks - 0, articles - 34

          使用commons的Configuration讀取XML

          Posted on 2008-03-20 12:06 qiyadeng 閱讀(3628) 評論(1)  編輯  收藏
          <?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
          }
          如果導(dǎo)入的時候沒有異常的話,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>,對應(yīng)的key是colors.text。
          3.訪問元素屬性的方法類似XPath的方法。
          4.返回的是list的元素,可以用getList()方法。就像上面例子中的buttons.name的內(nèi)容是"OK,Cancel,Help",用getList()
          方法返回的是3個元素組成的List。這里的分隔符是“,”,可以通過setDefaultDelimiter()方法進(jìn)行指定。
          5.可以操作propertiesConfiguration,就像是例子中的<default>元素。
          上面是個最簡單的XML格式,但是還有些相對復(fù)雜的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
          有兩個地方都出現(xiàn)了。其實返回的是個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的方法是為了,省略在下面子元素前全路徑。在實際應(yīng)用中可能不一定會直接指定table(0),這可以結(jié)合上面的Object prop = config.getProperty("tables.table.name")進(jìn)行迭代。

          Feedback

          # re: 使用commons的Configuration讀取XML  回復(fù)  更多評論   

          2008-03-21 00:13 by Jam Chan
          挺好用喲!

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 根河市| 衢州市| 大兴区| 兴山县| 大渡口区| 广平县| 榕江县| 宝清县| 绍兴市| 北碚区| 洪雅县| 阜城县| 怀来县| 上饶县| 河南省| 远安县| 娄烦县| 紫云| 克拉玛依市| 绩溪县| 隆化县| 阳西县| 青田县| 手游| 旺苍县| 乡宁县| 商水县| 陇川县| 法库县| 中江县| 玛沁县| 敦化市| 洛浦县| 咸丰县| 天等县| 木里| 西乡县| 汽车| 花莲县| 南投市| 仁怀市|