commons-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Simone Tripodi <simonetrip...@apache.org>
Subject Re: Re: [digester]How to use SimpleRegexMatcher?
Date Thu, 31 Mar 2011 06:36:04 GMT
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


Mime
View raw message