commons-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Kurt Xu" <fxbird1...@163.com>
Subject Re: Re: [digester]How to use SimpleRegexMatcher?
Date Fri, 01 Apr 2011 01:21:39 GMT
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  
<simonetripodi@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
> <simonetripodi@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 <fxbird1978@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 <fxbird@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-unsubscribe@commons.apache.org
>>>> For additional commands, e-mail: user-help@commons.apache.org
>>>>
>>>
>>>
>>> --
>>> Using Opera's revolutionary email client: http://www.opera.com/mail/
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: user-unsubscribe@commons.apache.org
>>> For additional commands, e-mail: user-help@commons.apache.org
>>>
>>>
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@commons.apache.org
> For additional commands, e-mail: user-help@commons.apache.org
>


-- 
Using Opera's revolutionary email client: http://www.opera.com/mail/


---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@commons.apache.org
For additional commands, e-mail: user-help@commons.apache.org


Mime
View raw message