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 <[email protected]> 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 <[email protected]> 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 <[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]



--
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]

Reply via email to