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]
