我正在比较两个XML节点,其中包含数字值和比较运算符,如下所示
<rule id="rule1" subject="user1" age="60" permission="granted"/>
<rule id="rule2" subject="user1" age=">=50" permission="denied"/>
这是一个非常简单的例子,其中rule1声明如果主题是user1,那么如果他的年龄是60则授予权限,而规则2声明如果年龄是50或大于50则拒绝user1的权限。所以它意味着这些规则是矛盾的。
我的问题是如何比较包含数值和比较运算符的年龄属性。在上面的例子中,我得出结论,这两个规则都有矛盾的价值。
我正在使用C#来比较这些属性值。
答案 0 :(得分:0)
在代码中添加runat="server"
,然后在c#代码中使用rule1.Attributes["age"]
访问该属性。如果逻辑需要,可以使用重载运算符进行比较。
答案 1 :(得分:0)
您可能会考虑在代码中执行此操作,使其变得更容易。
if(age > 50)
permission = "denied";
else if(age == 60)
permission = "granted";
答案 2 :(得分:0)
我将从xml创建一个语法树,并使用树来评估条件。至于如何评估基于比较的规则,您可以编写自己的类,如:
public enum BinaryOperator
{
LessThenOrEqual,
LessThen,
Equal,
GreaterThen,
GreaterThenOrEqual
}
public class BinaryOperatorEvaluator
{
public BinaryOperatorEvaluator(BinaryOperator op)
{
Operator = op;
}
public BinaryOperator Operator { get; private set; }
public bool Evaluate(IComparable x, IComparable y)
{
switch (Operator)
{
case BinaryOperator.Equal:
return x.CompareTo(y) == 0;
case BinaryOperator.GreaterThen:
return x.CompareTo(y) > 0;
case BinaryOperator.GreaterThenOrEqual:
return x.CompareTo(y) >= 0;
case BinaryOperator.LessThen:
return x.CompareTo(y) < 0;
case BinaryOperator.LessThenOrEqual:
return x.CompareTo(y) <= 0;
default:
throw new NotImplementedException();
}
}
public static BinaryOperatorEvaluator FromExpression(string expression, out int value)
{
var regexValidTerm = new Regex("^(?<operator>(<=|=|>=|<|>)?)(?<numeric>([0-9]+))$");
var match = regexValidTerm.Match(expression);
if (!match.Success)
{
throw new ArgumentException("Not a valid expression.", "expression");
}
var opValue = match.Groups["operator"].Value;
var op = BinaryOperator.Equal;
if (!string.IsNullOrEmpty(opValue))
{
switch(opValue)
{
case "<=":
op = BinaryOperator.LessThenOrEqual;
break;
case "=":
op = BinaryOperator.Equal;
break;
case ">=":
op = BinaryOperator.GreaterThenOrEqual;
break;
case "<":
op = BinaryOperator.LessThen;
break;
case ">":
op = BinaryOperator.LessThenOrEqual;
break;
default:
throw new NotImplementedException();
}
}
value = int.Parse(match.Groups["numeric"].Value);
return new BinaryOperatorEvaluator(op);
}
}
int number;
var bo = BinaryOperatorEvaluator.FromExpression("<=15", out number);
// false
var foo = bo.Evaluate(16, number);
// true
foo = bo.Evaluate(15, number);
// also true
foo = bo.Evaluate(14, number);