java - Wildcard in Digester XML rules -
java - Wildcard in Digester XML rules -
i've seen different threads discuss kind of issue have. here few: http://www.mailinglistarchive.com/commons-user@jakarta.apache.org/msg05061.html, http://stackoverflow.com/questions/2165168/digester-extracting-node-name).
yet, still can't find solution issue. here xml data:
<rows> <row> <firstname>paul</firstname> <lastname>moris</lastname> </row> <row> <firstname>john</firstname> <lastname>aiyer</lastname> <age>35</age> </row> </rows> what want define xml rules allow me map each row map. can't map elements referring names because not possible elements known upfront.
i hoping allow me this:
<digester-rules> <pattern value="rows/row"> <object-create-rule classname="address"/> <set-next-rule methodname="add" paramtype="java.lang.object"/> <set-properties-rule/> <pattern value="*"> <call-method-rule methodname="set" paramcount="2"/> <call-param-rule paramnumber='0'/> <call-param-rule paramnumber='1'/> </pattern> </pattern> </digester-rules> the implementation of address is:
public class address { map<string,string> c= new hashmap<string,string>(); public void set(string name, string value){ c.put(name, value); } public string tostring(){ homecoming c.tostring(); } } unfortunately, when run code 2 addresses created empty underlying map. when utilize extendedbaserules, nil matched.
any help much appreciated.
max.
i think digester not excel in parsing legacy xml. but, fortunately, it's extensible plenty can tweaked work in of these cases.
i managed resolve problem using java api, not xml rules. it's of import utilize digester's extendedbaserules class in order match patterns rows/row/* , subclass standard callparamrule in order pass tag name first argument method addaddressline() of class address (i renamed method set() in class address addaddressline()).
digester digester = new digester(); digester.setrules(new extendedbaserules()); digester.setvalidating( false ); digester.addobjectcreate("rows", addresses.class); digester.addobjectcreate( "rows/row", address.class ); digester.addsetnext( "rows/row", "add"); digester.addsetproperties("rows/row"); digester.addcallmethod("rows/row/*", "addaddressline", 2); digester.addrule("rows/row/*", new tagnameawarepathcallparamrule(0)); digester.addcallparam("rows/row/*", 1); addresses addresses = (addresses) digester.parse(new file(file_to_parse)); the class tagnameawarepathcallparamrule implemented purpose:
public class tagnameawarepathcallparamrule extends callparamrule { public tagnameawarepathcallparamrule(int paramindex) { super(paramindex); } public void end(string namespace, string name) { if (bodytextstack != null && !bodytextstack.empty()) { // force 1 parameter onto top set of // parameters object parameters[] = (object[]) digester.peekparams(); parameters[paramindex] = name; } } } the classes used storing output of parsing:
public class addresses { private list<address> addresses = new arraylist<address>(); public void add(address a) { addresses.add(a); } public list<address> getaddresses() { homecoming collections.unmodifiablelist(addresses); } public string tostring() { stringbuilder sb = new stringbuilder(); (address : addresses) { sb.append("address: ").append(a.tostring()).append(','); } homecoming sb.tostring(); } } public class address { map<string,string> c= new hashmap<string,string>(); public void addaddressline(string name, string value){ c.put(name, value); } public string tostring(){ homecoming c.tostring(); } } java wildcard apache-commons-digester
Comments
Post a Comment