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]

Reply via email to