Hi Kurt Ok now I get it: exactly, calling Digetser.setRules() you loose all the already set Rules instance, so it would be better if you call it first. HTH, Simo
http://people.apache.org/~simonetripodi/ http://www.99soft.org/ On Fri, Apr 1, 2011 at 9:14 AM, Kurt Xu <[email protected]> wrote: > Hi Simone: > I mean if I implement rules ,say RulesA, RulesB , then setRules(new > RulesA()),setRules(new RulesB()). > the second calling setRules would reset the first call, right? > > > Thanks. > > Kurt > > > >> Hi Kurt, >> glad you fixed your issue, but honestly I didn't understand your last >> question, apologizes :( Can you provide more details/some sample? >> Thanks! >> Simo >> >> PS nope, I'm from Italy :P >> >> http://people.apache.org/~simonetripodi/ >> http://www.99soft.org/ >> >> >> >> On Fri, Apr 1, 2011 at 3:21 AM, Kurt Xu <[email protected]> wrote: >>> >>> Hi Simone: >>> >>> I tried by myself after emailing and resovled it . the method is the >>> same >>> as your reply. I have a question still though. What if I want do set two >>> customized rule . The second setRules can reset or override the first >>> calling, can't it? >>> >>> btw: why u say ni hao, r u from China? >>> >>> Many thanks. >>> >>> >>> Kurt >>> >>> >>> >>> On Thu, 31 Mar 2011 14:39:59 +0800, Simone Tripodi >>> <[email protected]> wrote: >>> >>>> Ni hao again Kurt, >>>> just realized that the ParaItemRule implementation is incomplete, use >>>> the one below. >>>> Simo >>>> >>>> public final class ParaItemRule extends org.apache.commons.digester.Rule >>>> { >>>> >>>> @Override >>>> public void body(String namespace, String name, String text) >>>> throws Exception { >>>> digester.push(new ParaItem(name, text)); >>>> } >>>> >>>> @Override >>>> public void end() throws Exception { >>>> digester.pop(); >>>> } >>>> >>>> http://people.apache.org/~simonetripodi/ >>>> http://www.99soft.org/ >>>> >>>> >>>> >>>> On Thu, Mar 31, 2011 at 8:36 AM, Simone Tripodi >>>> <[email protected]> wrote: >>>>> >>>>> Hi Kurt, >>>>> calling the setRules() method in the way you did, makes the Rules >>>>> instance is reset, so you loose the already set patterns. >>>>> modify the code in order that the setRules() method is invoked before >>>>> setting patterns/rules. >>>>> HTH, >>>>> Simo >>>>> >>>>> private void parseProject2(URL url) throws IOException, SAXException { >>>>> Digester d = new Digester(); >>>>> d.setRules(new RegexRules(new SimpleRegexMatcher())); >>>>> >>>>> String pathFunc = "Project/Functionality"; >>>>> String pathClass = pathFunc + "/Class"; >>>>> String pathPara = pathClass + "/Parameter"; >>>>> >>>>> d.addObjectCreate("Project", Project.class); >>>>> d.addSetProperties("Project"); >>>>> >>>>> d.addObjectCreate(pathFunc, Functionality.class); >>>>> d.addSetNext(pathFunc, "addFunctionality"); >>>>> d.addSetProperties(pathFunc); >>>>> // d.addSetProperties(pathFunc + "/BasicInfo"); >>>>> >>>>> d.addObjectCreate(pathClass, ClassItem.class); >>>>> d.addSetNext(pathClass, "addClassItem"); >>>>> d.addSetProperties(pathClass); >>>>> >>>>> >>>>> d.addObjectCreate(pathPara, Parameter.class); >>>>> d.addSetNext(pathPara, "addParameter"); >>>>> >>>>> >>>>> d.addRule(pathPara+"/Main/*", new ParaItemRule()); >>>>> d.addSetNext(pathPara+"/Main/*", "addMainParaItem"); >>>>> >>>>> d.addRule(pathPara +"SubText/*", new ParaItemRule()); >>>>> d.addSetNext(pathPara +"SubText/*", "addSubParaItem"); >>>>> >>>>> d.parse(url); >>>>> Project project = (Project) d.getRoot(); >>>>> >>>>> System.out.println(); >>>>> } >>>>> >>>>> >>>>> http://people.apache.org/~simonetripodi/ >>>>> http://www.99soft.org/ >>>>> >>>>> >>>>> >>>>> On Thu, Mar 31, 2011 at 5:44 AM, Kurt Xu <[email protected]> wrote: >>>>>> >>>>>> Sorry Simone: >>>>>> >>>>>> I need to paste the full xml and java file to help u locate the >>>>>> error,:) >>>>>> >>>>>> xml: >>>>>> >>>>>> <?xml version="1.0" encoding="UTF-8"?> >>>>>> >>>>>> <Project name="project1"> >>>>>> <Functionality description="add comment" >>>>>> url="http://dev.mygame.co.jp/user/register.do" >>>>>> actionName="com.mygame.action.UserAction" >>>>>> actionMethod="register"> >>>>>> >>>>>> <Class name="com.mygame.bo.UserBOImpl" method="register"> >>>>>> <Parameter name="user" index="0" type="insert"> >>>>>> <Main> >>>>>> <DeviceType constant="true">pc</DeviceType> >>>>>> <CheckStatus constant="true">N</CheckStatus> >>>>>> <ValidCheck constant="true">Yes</ValidCheck> >>>>>> <CheckDesc>first check desc</CheckDesc> >>>>>> <UserId>userid</UserId> >>>>>> <PrimaryKey1>cmtno</PrimaryKey1> >>>>>> </Main> >>>>>> <SubText> >>>>>> <!--<Type constant="true/false"></Type>--> >>>>>> <!--<Title>title</Title>--> >>>>>> <Content>contents</Content> >>>>>> <WriterId>writeid</WriterId> >>>>>> <WriterUserName>userid</WriterUserName> >>>>>> </SubText> >>>>>> </Parameter> >>>>>> <Parameter name="postVO" index="1" type="update" >>>>>> table="MOCO_CODICMT"> >>>>>> ..... >>>>>> </Parameter> >>>>>> </Class> >>>>>> </Functionality> >>>>>> </Project> >>>>>> >>>>>> java code: >>>>>> >>>>>> parser method: >>>>>> private void parseProject2(URL url) throws IOException, SAXException { >>>>>> Digester d = new Digester(); >>>>>> >>>>>> String pathFunc = "Project/Functionality"; >>>>>> String pathClass = pathFunc + "/Class"; >>>>>> String pathPara = pathClass + "/Parameter"; >>>>>> >>>>>> d.addObjectCreate("Project", Project.class); >>>>>> d.addSetProperties("Project"); >>>>>> >>>>>> d.addObjectCreate(pathFunc, Functionality.class); >>>>>> d.addSetNext(pathFunc, "addFunctionality"); >>>>>> d.addSetProperties(pathFunc); >>>>>> // d.addSetProperties(pathFunc + "/BasicInfo"); >>>>>> >>>>>> d.addObjectCreate(pathClass, ClassItem.class); >>>>>> d.addSetNext(pathClass, "addClassItem"); >>>>>> d.addSetProperties(pathClass); >>>>>> >>>>>> >>>>>> d.addObjectCreate(pathPara, Parameter.class); >>>>>> d.addSetNext(pathPara, "addParameter"); >>>>>> >>>>>> >>>>>> d.setRules(new RegexRules(new SimpleRegexMatcher())); >>>>>> >>>>>> >>>>>> d.addRule(pathPara+"/Main/*", new ParaItemRule()); >>>>>> d.addSetNext(pathPara+"/Main/*", "addMainParaItem"); >>>>>> >>>>>> d.addRule(pathPara +"SubText/*", new ParaItemRule()); >>>>>> d.addSetNext(pathPara +"SubText/*", "addSubParaItem"); >>>>>> >>>>>> d.parse(url); >>>>>> Project project = (Project) d.getRoot(); >>>>>> >>>>>> System.out.println(); >>>>>> } >>>>>> >>>>>> ClassItem.java ---a pojo for saving all its Parameters >>>>>> >>>>>> public class ClassItem { >>>>>> >>>>>> private String method; >>>>>> private String name; >>>>>> private String handler=""; >>>>>> private List<Parameter> parameters; >>>>>> >>>>>> public ClassItem(String name, String method, List<Parameter> >>>>>> parameters) >>>>>> { >>>>>> this.name = name; >>>>>> this.method = method; >>>>>> this.parameters = parameters; >>>>>> } >>>>>> >>>>>> public ClassItem() { >>>>>> } >>>>>> >>>>>> public String getMethod() { >>>>>> return method; >>>>>> } >>>>>> >>>>>> public void setMethod(String method) { >>>>>> this.method = method; >>>>>> } >>>>>> >>>>>> public String getName() { >>>>>> return name; >>>>>> } >>>>>> >>>>>> public void setName(String name) { >>>>>> this.name = name; >>>>>> } >>>>>> >>>>>> public void addParameter(Parameter parameter){ >>>>>> System.out.println("add parameter"); >>>>>> if (parameters==null){ >>>>>> parameters=new ArrayList<Parameter>(); >>>>>> } >>>>>> >>>>>> parameters.add(parameter); >>>>>> } >>>>>> >>>>>> public List<Parameter> getParameters() { >>>>>> return parameters; >>>>>> } >>>>>> >>>>>> public String getHandler() { >>>>>> return handler; >>>>>> } >>>>>> >>>>>> public void setHandler(String handler) { >>>>>> this.handler = handler; >>>>>> } >>>>>> } >>>>>> >>>>>> >>>>>> >>>>>> thanks. >>>>>> >>>>>> Kurt >>>>>> >>>>>> >>>>>>> Hi Kurt, >>>>>>> I suggest you first creating a digester rule that helps you handling >>>>>>> a >>>>>>> generic ParaItem element: >>>>>>> >>>>>>> public final class ParaItemRule extends >>>>>>> org.apache.commons.digester.Rule { >>>>>>> >>>>>>> @Override >>>>>>> public void body(String namespace, String name, String text) >>>>>>> throws Exception { >>>>>>> digester.push(new ParaItem(name, text)); >>>>>>> } >>>>>>> >>>>>>> } >>>>>>> >>>>>>> then plug the digester rules in the following way: >>>>>>> >>>>>>> Digester digester = new Digester(); >>>>>>> >>>>>>> /* take a look at >>>>>>> >>>>>>> >>>>>>> >>>>>>> http://commons.apache.org/digester/apidocs/org/apache/commons/digester/SimpleRegexMatcher.html >>>>>>> */ >>>>>>> digester.setRules(new RegexRules(new SimpleRegexMatcher())); >>>>>>> >>>>>>> digester.addRule("Class/Parameter/Main/*", new ParaItemRule()); >>>>>>> digester.addSetNext("Class/Parameter/Main/*", >>>>>>> "addMainParaItem"); >>>>>>> >>>>>>> digester.addRule("Class/Parameter/SubText/*", new >>>>>>> ParaItemRule()); >>>>>>> digester.addSetNext("Class/Parameter/SubText/*", >>>>>>> "addSubParaItem"); >>>>>>> >>>>>>> THT, let me know! ;) >>>>>>> Simo >>>>>>> >>>>>>> http://people.apache.org/~simonetripodi/ >>>>>>> http://www.99soft.org/ >>>>>>> >>>>>>> >>>>>>> >>>>>>> On Wed, Mar 30, 2011 at 11:49 AM, fxbird <[email protected]> wrote: >>>>>>>> >>>>>>>> Hi all: >>>>>>>> >>>>>>>> I want to match some unknow elements nested some parent element >>>>>>>> where >>>>>>>> some newly defined element might be added sometime. >>>>>>>> >>>>>>>> The sample xml is as below: >>>>>>>> >>>>>>>> <Class >>>>>>>> name="jp.hangame.motecoorde.coordinate.bo.CoordinateCommentBoImpl" >>>>>>>> method="entry"> >>>>>>>> <Parameter name="comment" index="0" type="insert" >>>>>>>> table="MOCO_CODICMT"> >>>>>>>> <Main> >>>>>>>> <DeviceType constant="true">pc</DeviceType> >>>>>>>> <CheckStatus constant="true">N</CheckStatus> >>>>>>>> <ValidCheck constant="true">Yes</ValidCheck> >>>>>>>> <CheckDesc></CheckDesc> >>>>>>>> <UserId>userid</UserId> >>>>>>>> <PrimaryKey1>cmtno</PrimaryKey1> >>>>>>>> </Main> >>>>>>>> <SubText> >>>>>>>> <!--<Type constant="true/false"></Type>--> >>>>>>>> <!--<Title>title</Title>--> >>>>>>>> <Content>contents</Content> >>>>>>>> <WriterId>writeid</WriterId> >>>>>>>> <WriterUserName>userid</WriterUserName> >>>>>>>> </SubText> >>>>>>>> </Parameter> >>>>>>>> </Class> >>>>>>>> >>>>>>>> >>>>>>>> The elements under <Main> and <SubText> are all variable someday, >>>>>>>> both >>>>>>>> name and amounts. So I define a ParaItem pojo to wrap sub elements >>>>>>>> of >>>>>>>> the >>>>>>>> two element. That means I want to create a Paraitem for every sub >>>>>>>> element >>>>>>>> ,whatever its name is, then add the object to paraent object >>>>>>>> Parameter's >>>>>>>> list property saving all the related Paraitem. >>>>>>>> >>>>>>>> The Paraitem source code is following: >>>>>>>> >>>>>>>> public class ParaItem { >>>>>>>> private String elemName; >>>>>>>> private String argPropNameOrValue; >>>>>>>> private boolean isConstant; >>>>>>>> public ParaItem() { >>>>>>>> } >>>>>>>> public ParaItem(String elemName, String argPropNameOrValue, >>>>>>>> boolean >>>>>>>> constant) { >>>>>>>> this.elemName = elemName; >>>>>>>> this.argPropNameOrValue = argPropNameOrValue; >>>>>>>> isConstant = constant; >>>>>>>> } >>>>>>>> public ParaItem(String elemName, String argPropNameOrValue) { >>>>>>>> this.elemName = elemName; >>>>>>>> this.argPropNameOrValue = argPropNameOrValue; >>>>>>>> } >>>>>>>> public String getElemName() { >>>>>>>> return elemName; >>>>>>>> } >>>>>>>> public String getArgPropNameOrValue() { >>>>>>>> return argPropNameOrValue; >>>>>>>> } >>>>>>>> public boolean isConstant() { >>>>>>>> return isConstant; >>>>>>>> } >>>>>>>> } >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> The Parameter source code is below: >>>>>>>> public class Parameter { >>>>>>>> private String index; >>>>>>>> private String operType; >>>>>>>> private String dataType; >>>>>>>> private List<ParaItem> listMainFiled =new ArrayList<ParaItem>(); >>>>>>>> private List<ParaItem> listSubField =new ArrayList<ParaItem>(); >>>>>>>> public Parameter(String operType) { >>>>>>>> this.operType = operType; >>>>>>>> } >>>>>>>> public List<ParaItem> getListMainFiled() { >>>>>>>> return listMainFiled; >>>>>>>> } >>>>>>>> public void setListMainFiled(List<ParaItem> listMainFiled) { >>>>>>>> this.listMainFiled = listMainFiled; >>>>>>>> } >>>>>>>> public List<ParaItem> getListSubField() { >>>>>>>> return listSubField; >>>>>>>> } >>>>>>>> public void setListSubField(List<ParaItem> listSubField) { >>>>>>>> this.listSubField = listSubField; >>>>>>>> } >>>>>>>> public String getIndex() { >>>>>>>> return index; >>>>>>>> } >>>>>>>> public void setIndex(String index) { >>>>>>>> this.index = index; >>>>>>>> } >>>>>>>> public String getOperType() { >>>>>>>> return operType; >>>>>>>> } >>>>>>>> public void setOperType(String operType) { >>>>>>>> this.operType = operType; >>>>>>>> } >>>>>>>> public String getDataType() { >>>>>>>> return dataType; >>>>>>>> } >>>>>>>> public void setDataType(String dataType) { >>>>>>>> this.dataType = dataType; >>>>>>>> } >>>>>>>> public void addMainParaItem(ParaItem pi){ >>>>>>>> getListMainFiled().add(pi); >>>>>>>> } >>>>>>>> public void addSubParaItem(ParaItem pi){ >>>>>>>> getListSubField().add(pi); >>>>>>>> } >>>>>>>> } >>>>>>>> >>>>>>>> I suppose regex rule is the best way to make it , but googling and >>>>>>>> the >>>>>>>> javadoc doesn't tell me how to set a regex expression for a pattern. >>>>>>>> No way >>>>>>>> out, who knows the solotion , thanks. >>>>>>>> >>>>>>>> >>>>>>>> Kurt >>>>>>>> >>>>>>> >>>>>>> --------------------------------------------------------------------- >>>>>>> To unsubscribe, e-mail: [email protected] >>>>>>> For additional commands, e-mail: [email protected] >>>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> Using Opera's revolutionary email client: http://www.opera.com/mail/ >>>>>> >>>>>> >>>>>> --------------------------------------------------------------------- >>>>>> To unsubscribe, e-mail: [email protected] >>>>>> For additional commands, e-mail: [email protected] >>>>>> >>>>>> >>>>> >>>> >>>> --------------------------------------------------------------------- >>>> To unsubscribe, e-mail: [email protected] >>>> For additional commands, e-mail: [email protected] >>>> >>> >>> >>> -- >>> Using Opera's revolutionary email client: http://www.opera.com/mail/ >>> >>> >>> --------------------------------------------------------------------- >>> To unsubscribe, e-mail: [email protected] >>> For additional commands, e-mail: [email protected] >>> >>> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: [email protected] >> For additional commands, e-mail: [email protected] >> > > > -- > Using Opera's revolutionary email client: http://www.opera.com/mail/ > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected] > > --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
