|
今天看了八進(jìn)制的《利用Digester把XML轉(zhuǎn)換為Java對象》,感覺挺好。你可以在這里http://www.cnblogs.com/bjzhanghao/archive/2007/05/15/125747.html訪問。加上混北民工的在評論中更詳細(xì)一點(diǎn)的例子。終于對Digester有了初步的了解。但是,對于詳細(xì)返回對象,在八進(jìn)制和混北民工的例子中表現(xiàn)得不是十分明朗。下面,我對例子做了一些修改,使Digester的規(guī)則表現(xiàn)清晰一些,另外添加配置規(guī)則來代替代碼入注規(guī)則的運(yùn)用方法。
注冊表ChartRegistry: public class ChartRegistry![]() ![]() { List<ChartConfig> registry = new ArrayList<ChartConfig>(); public void addChart(ChartConfig obj)![]() { registry.add(obj); } public java.util.List<ChartConfig> getRegistry()![]() { return registry; }![]() ![]() public String toString() { return ReflectionToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); } }
圖表設(shè)定器ChartConfig: public class ChartConfig implements Comparable![]() ![]() { private String id; private boolean legendVisible; private String type; private int width; private String description;![]() public String getDescription()![]() { return description; } public void setDescription(String description)![]() { this.description = description; } public String getId()![]() { return id; } public void setId(String id)![]() { this.id = id; } public boolean isLegendVisible()![]() { return legendVisible; } public void setLegendVisible(boolean legendVisible)![]() { this.legendVisible = legendVisible; } public String getType()![]() { return type; } public void setType(String type)![]() { this.type = type; } public int getWidth()![]() { return width; } public void setWidth(int width)![]() { this.width = width; }![]() public String toString() { return ReflectionToStringBuilder.reflectionToString(this,ToStringStyle.MULTI_LINE_STYLE); } public int compareTo(Object o)![]() {![]() if(o instanceof ChartConfig) { ChartConfig o1 = (ChartConfig)o; return this.id.compareTo(o1.id); } return -1; } }
圖表數(shù)據(jù)設(shè)定(簡化版)charts.xml: <?xml version="1.0" encoding="GBK" ?> <charts> <chart id="BarChart1"> <legendVisible>false</legendVisible> <type>中國</type> <width>500</width> <description>11</description> </chart> <chart id="BarChart2"> <legendVisible>true</legendVisible> <type>美國</type> <width>500</width> <description>22</description> </chart> </charts>
配置規(guī)則設(shè)定rule.xml: <?xml version=‘1.0‘?> <!DOCTYPE digester-rules PUBLIC "-//Jakarta Apache //DTD digester-rules XML V1.0//EN" "file:///../digester/dtds/digester-rules.dtd">![]() <digester-rules> <pattern value="charts"> <!-- 遇上charts節(jié)點(diǎn)時(shí) --> <object-create-rule classname="study.jakarta.commons.digester.ChartRegistry" /> <!-- 創(chuàng)建對象 --> <set-properties-rule /> <!-- 設(shè)置屬性 --> <pattern value="chart"> <!-- 遇上charts節(jié)點(diǎn)時(shí) --> <object-create-rule classname="study.jakarta.commons.digester.ChartConfig" /> <!-- 創(chuàng)建對象 --> <set-next-rule methodname="addChart" paramtype="study.jakarta.commons.digester.ChartConfig"/> <!-- 調(diào)用定對象方法 --> <set-properties-rule /> <!-- 設(shè)置屬性 --> <bean-property-setter-rule pattern="legendVisible" /> <!-- 調(diào)用對象的setter方法 --> <bean-property-setter-rule pattern="type" /> <bean-property-setter-rule pattern="width" /> <bean-property-setter-rule pattern="description" /> </pattern> </pattern> </digester-rules>
跑一下試試看: public class DigesterTest![]() ![]() { public static void main(String[] args)![]() { try![]() { String charts = "F:\\計(jì)算機(jī)\\jakarta-commons\\jakarta-commons-cookbook-code\\examples\\study\\jakarta\\commons\\digester\\charts.xml"; String rule="F:\\計(jì)算機(jī)\\jakarta-commons\\jakarta-commons-cookbook-code\\examples\\study\\jakarta\\commons\\digester\\rules.xml"; DigesterTest test= new DigesterTest(); System.out.println("======================= getChartRegistryWithCodeRule =========================="); ChartRegistry c= test.getChartRegistryWithCodeRule(new File(charts)); System.out.println(c); System.out.println("======================= getChartRegistryWithCodeRule =========================="); System.out.println(test.getChartRegistryWithFileRule(new File(charts),new File(rule))); } catch(Exception e)![]() { e.printStackTrace(); } } //代碼中設(shè)定規(guī)則![]() private ChartRegistry getChartRegistryWithCodeRule(File charts) throws IOException, SAXException { InputStream is = new FileInputStream(charts); Digester digester = new Digester(); digester.setValidating(false);//不進(jìn)行XML與相應(yīng)的DTD的合法性驗(yàn)證 digester.push(new ChartRegistry()); //創(chuàng)建一個(gè)ChartRegistry對象, 你這樣用這種形式建立頂對象(選用這種方式,注釋下一行) //digester.addObjectCreate("charts", ChartRegistry.class); //創(chuàng)建一個(gè)ChartRegistry對象, 你也這樣用這種形式建立頂對象(選用這種方式,注釋上一行) digester.addSetProperties("charts"); digester.addObjectCreate("charts/chart", ChartConfig.class); //當(dāng)遇到<chart>時(shí)創(chuàng)建一個(gè)ChartConfig對象 digester.addSetProperties("charts/chart"); //根據(jù)<chart>元素的屬性(attribute),對剛創(chuàng)建的ChartConfig對象的屬性(property)進(jìn)行設(shè)置 digester.addBeanPropertySetter("charts/chart/legendVisible");//當(dāng)遇到<chart>的子元素<legendVisible>時(shí)將子元素值設(shè)置為ChartConfig對象的legendVisible屬性的setter方法 digester.addBeanPropertySetter("charts/chart/type"); //參考上面注釋 digester.addBeanPropertySetter("charts/chart/width"); //參考上面注釋 digester.addBeanPropertySetter("charts/chart/description"); //參考上面注釋 digester.addSetNext("charts/chart", "addChart"); //當(dāng)再次遇到<charts>的子元素<chart>時(shí)調(diào)用頂對象的addChart方法。 ChartRegistry c = (ChartRegistry)digester.parse(is); //分析結(jié)束后,返回根元素 Collections.sort(c.getRegistry()); return c; } //配置中設(shè)定規(guī)則![]() private ChartRegistry getChartRegistryWithFileRule(File charts,File rule) throws IOException, SAXException { Digester digester = DigesterLoader.createDigester(rule.toURL()); ChartRegistry c = (ChartRegistry)digester.parse(charts); Collections.sort(c.getRegistry()); return c; } }
結(jié)果輸出: ======================= getChartRegistryWithCodeRule ========================== study.jakarta.commons.digester.ChartRegistry@16df84b[ registry=[study.jakarta.commons.digester.ChartConfig@1aa57fb[ id=BarChart1 legendVisible=false type=中國 width=500 description=11 ], study.jakarta.commons.digester.ChartConfig@763f5d[ id=BarChart2 legendVisible=true type=美國 width=500 description=22 ]] ] ======================= getChartRegistryWithCodeRule ========================== study.jakarta.commons.digester.ChartRegistry@18f6235[ registry=[study.jakarta.commons.digester.ChartConfig@78a212[ id=BarChart1 legendVisible=false type=中國 width=500 description=11 ], study.jakarta.commons.digester.ChartConfig@1d85f79[ id=BarChart2 legendVisible=true type=美國 width=500 description=22 ]] ]
剛學(xué),未免存在不當(dāng)?shù)牡胤?,歡迎指正,交流。 |
|
|