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

Popular posts from this blog

java - How to set log4j.defaultInitOverride property to false in jboss server 6 -

c - GStreamer 1.0 1.4.5 RTSP Example Server sends 503 Service unavailable -

Using ajax with sonata admin list view pagination -