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]