表达式解析的学习
今天我们解决了工作流中表达式的解析,我们用到了一个开源框架叫beanShell,他可以实现表达式的求值,如表达试A+B-C<D等这样的表达试,下面我们来模拟一个简单的表达式求值
private Interpreter interp = new Interpreter(); // 表达式解析器
public Object evaluate() throws UtilEvalError, EvalError {
//创建命名空间,
NameSpace namespace = new NameSpace(new BshClassManager(), expression);
//获得工作流中的变量
List variables = this.workflowcontext.getWorkflow().getVariable();
for (int i = 0; i < variables.size(); i++) {
Variable variable = (Variable) variables.get(i);
//初始化集合
namespace.setVariable(variable.getName(), variable.getValue(),
false);
}
Object object = null;
object = interp.eval(this.expression, namespace);
return object;
}
interp.eval(this.expression, namespace);会反正一个Object的对象,他可以是Boolean,也可以是Integer等对象,NameSpace是变量命名空间,解析的时候表达式中的变量值会根据哪个空间中对应的键替换中值,exptession就是一个表达式,在他当中可以有变量存在(当然变量的值必须在NameSpace当中定义)。在定义NameSpace的时候要注意,数子比较必须包装成Integer类型的,不能包装成String类型,要不就会报告错误.
当然beanShell的功能远远不至这点,其他功能查质料。嘿嘿
接下来我们谈谈怎么把一个数据对象的信息写到XML里,并且建立关系。
这里我们用到了xerces。我们还是以模拟工作流当中的工作流引擎写入到XML里
import org.apache.xerces.dom.DocumentImpl;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
try {
//创建Document对象
Document doc = new DocumentImpl();
//建立关联信息
writeWorkflow(doc);
OutputFormat format = new OutputFormat(doc, encoding, true);
format.setEncoding(encoding);
XMLSerializer serial = new XMLSerializer(xml, format);
serial.asDOMSerializer();
serial.serialize(doc.getDocumentElement());
}
catch (Exception ioe) {
ioe.printStackTrace();
}
}
private void writeWorkflow(Document doc) {
// TODO Auto-generated method stub
Element element = doc.createElement("workflow");
List list = workflow.getActivity();
Element activites = doc.createElement("activites");
element.appendChild(activites);
for(int i=0;i<list.size();i++)
{
Element ele = doc.createElement(((FlObject)list.get(i)).getName());
this.writeActivity(ele,(Activity)list.get(i));
activites.appendChild(ele);
}
doc.appendChild(element);
}
通过以上的代码很容易就可以把一个数据对象和他们之间的关系写入到XML当中