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:39:59 GMT
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


Mime
View raw message