如何使用XPath 计算字符串表达式
曾经看到如下代码:
public static float compute(string p_str)
{
float rtnValue=0;
XmlDocument doc = new XmlDocument();
XPathNavigator nav=doc.CreateNavigator();
rtnValue=Convert.ToSingle(nav.Evaluate(p_str));
return rtnValue;
}
今天拿来测试时发现1 * 3 - (6/2 + 5) 等表达式都能正常工作, 但是一用除(4/2), 就会抛出异常
"The expression passed to this method should result in a NodeSet."
本人对XPath不熟, 请高手指点!!
问题点数:50、回复次数:14Top
1 楼BoYan1982(Improve your way of Thinking and Acting)回复于 2005-12-21 14:44:35 得分 0
楼主真笨,1 * 3 - (6/2 + 5)不也用到 / 了嘛Top
2 楼BoYan1982(Improve your way of Thinking and Acting)回复于 2005-12-21 14:46:16 得分 0
笨死了笨死了Top
3 楼BoYan1982(Improve your way of Thinking and Acting)回复于 2005-12-21 14:57:41 得分 20
网上搜来的
//replace your function
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Reflection;
using System.Text;
public static object Calc(string expression)
{
string className = "Calc";
string methodName = "Run";
expression=expression.Replace("/","*1.0/");
// 创建编译器实例。
ICodeCompiler complier = (new CSharpCodeProvider().CreateCompiler());
// 设置编译参数。
CompilerParameters paras = new CompilerParameters();
paras.GenerateExecutable = false;
paras.GenerateInMemory = true;
// 创建动态代码。
StringBuilder classSource = new StringBuilder();
classSource.Append("public class "+ className +"\n");
classSource.Append("{\n");
classSource.Append(" public object " + methodName + "()\n");
classSource.Append(" {\n");
classSource.Append(" return "+ expression + ";\n");
classSource.Append(" }\n");
classSource.Append("}");
//System.Diagnostics.Debug.WriteLine(classSource.ToString());
// 编译代码。
CompilerResults result = complier.CompileAssemblyFromSource(paras, classSource.ToString());
// 获取编译后的程序集。
Assembly assembly = result.CompiledAssembly;
// 动态调用方法。
object eval = assembly.CreateInstance(className);
MethodInfo method = eval.GetType().GetMethod(methodName);
object reobj = method.Invoke(eval, null);
GC.Collect();
return reobj;
}Top
4 楼lgg06(随风)回复于 2005-12-21 15:01:30 得分 0
sorry sorry.
1 * 3 - (6/2 + 5) 执行会抛异常的,,, 大意了大意了:本意是说 1 * 3 - (6 + 5)可以执行Top
5 楼BoYan1982(Improve your way of Thinking and Acting)回复于 2005-12-21 15:03:27 得分 0
哇, 你什么时候44条裤衩啦Top
6 楼Sunmast(速马@Redmond, WA)回复于 2005-12-21 15:25:02 得分 30
动态编译太慢了
用这个:
http://blog.csdn.net/playyuer/archive/2004/12/05/205739.aspxTop
7 楼Sunmast(速马@Redmond, WA)回复于 2005-12-21 15:27:20 得分 0
或者使用JScript引擎:
using Microsoft.JScript;
using Microsoft.JScript.Vsa;
VsaEngine ve = VsaEngine.CreateEngine();
return Eval.JScriptEvaluate("4/2", ve);Top
8 楼lgg06(随风)回复于 2005-12-21 16:39:09 得分 0
速马大哥:
用XPath不可以实现吗?
错误提示是什么意思啊?Top
9 楼min_jie(止戈)回复于 2005-12-21 16:47:47 得分 0
不要用这个来做字符串表达的计算。。
用到/的时候很容易出错。。。
用其它方法吧。。现在方法多的是。。Top
10 楼Sunmast(速马@Redmond, WA)回复于 2005-12-21 17:34:50 得分 0
/被解析为xml dom的路径分割符了Top
11 楼shaoyongabo477(好兄弟)回复于 2005-12-21 17:37:14 得分 0
upTop
12 楼Sunmast(速马@Redmond, WA)回复于 2005-12-21 17:45:28 得分 0
终于找到了,要用div代替/
try:
compute("1+2 div 3")Top
13 楼Sunmast(速马@Redmond, WA)回复于 2005-12-21 17:49:47 得分 0
// 或者修改一下函数
public static float compute(string p_str)
{
XPathNavigator nav = new XmlDocument().CreateNavigator();
return Convert.ToSingle(nav.Evaluate(p_str.Replace("/", " div ")));
}Top
14 楼lgg06(随风)回复于 2005-12-22 16:29:09 得分 0
谢了Top




