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]