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]