<?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)行迭代。