Sorry, I lost you, didn't understand :( Please provide me a more concrete sample, please Simo
http://people.apache.org/~simonetripodi/ http://www.99soft.org/ On Fri, Apr 1, 2011 at 9:37 AM, Kurt Xu <fxbird1...@163.com> wrote: > Hi Simone: > Maybe you got me wrong. Two RulesX needs calling setRules twice ,right? How > could be just set once. > > Thanks > > Kurt > > > On Fri, 01 Apr 2011 15:27:09 +0800, Simone Tripodi > <simonetrip...@apache.org> wrote: > >> 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 <fxbird1...@163.com> 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 <fxbird1...@163.com> 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 >>>>> <simonetrip...@apache.org> 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 >>>>>> <simonetrip...@apache.org> 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 <fxbird1...@163.com> 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 <fxb...@gmail.com> 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: user-unsubscr...@commons.apache.org >>>>>>>>> For additional commands, e-mail: user-h...@commons.apache.org >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> Using Opera's revolutionary email client: http://www.opera.com/mail/ >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> --------------------------------------------------------------------- >>>>>>>> To unsubscribe, e-mail: user-unsubscr...@commons.apache.org >>>>>>>> For additional commands, e-mail: user-h...@commons.apache.org >>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>>> --------------------------------------------------------------------- >>>>>> To unsubscribe, e-mail: user-unsubscr...@commons.apache.org >>>>>> For additional commands, e-mail: user-h...@commons.apache.org >>>>>> >>>>> >>>>> >>>>> -- >>>>> Using Opera's revolutionary email client: http://www.opera.com/mail/ >>>>> >>>>> >>>>> --------------------------------------------------------------------- >>>>> To unsubscribe, e-mail: user-unsubscr...@commons.apache.org >>>>> For additional commands, e-mail: user-h...@commons.apache.org >>>>> >>>>> >>>> >>>> --------------------------------------------------------------------- >>>> To unsubscribe, e-mail: user-unsubscr...@commons.apache.org >>>> For additional commands, e-mail: user-h...@commons.apache.org >>>> >>> >>> >>> -- >>> Using Opera's revolutionary email client: http://www.opera.com/mail/ >>> >>> >>> --------------------------------------------------------------------- >>> To unsubscribe, e-mail: user-unsubscr...@commons.apache.org >>> For additional commands, e-mail: user-h...@commons.apache.org >>> >>> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: user-unsubscr...@commons.apache.org >> For additional commands, e-mail: user-h...@commons.apache.org >> > > > -- > Using Opera's revolutionary email client: http://www.opera.com/mail/ > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: user-unsubscr...@commons.apache.org > For additional commands, e-mail: user-h...@commons.apache.org > > --------------------------------------------------------------------- To unsubscribe, e-mail: user-unsubscr...@commons.apache.org For additional commands, e-mail: user-h...@commons.apache.org