C# XML体系结构
对于我的应用程序,我必须使用一些未定义的不同检测策略。战略的定义方式如下:C# XML体系结构,c#,.net,xml,C#,.net,Xml,对于我的应用程序,我必须使用一些未定义的不同检测策略。战略的定义方式如下: AND门也可以是OR门。现在,我在代码中硬编码了所有这些规则。为了更好的可扩展性,我想在一个XML文件中分别定义所有检测开始规则并对其进行解析。但我不确定如何在XML文件中定义这样的检测策略。关于如何开始的任何提示?它们会比图表中的更复杂吗 如果不是的话,可以使用下面的方法,将图表的结构转换为 <Strategy> <Name>Test-1</name> <Qu
AND门也可以是OR门。现在,我在代码中硬编码了所有这些规则。为了更好的可扩展性,我想在一个XML文件中分别定义所有检测开始规则并对其进行解析。但我不确定如何在XML文件中定义这样的检测策略。关于如何开始的任何提示?它们会比图表中的更复杂吗 如果不是的话,可以使用下面的方法,将图表的结构转换为
<Strategy>
<Name>Test-1</name>
<Quality-problem>Too much splurge in the windler<Quality-problem>
<Gate type="AND">
<Left>
<Metric>foo</Metric>
<Comparison>less-than</Comparison>
<Threshold>100</Threshhold>
</Left>
<Right>
<Metric>bar</Metric>
<Comparison>greater-than</Comparison>
<Threshold>200</Threshhold>
</Right>
</Gate>
</Strategy>
测试-1
在卷扬机上挥霍太多
福
少于
100
酒吧
大于
200
如果它们变得更复杂,你仍然可以使用上面的东西,只是稍微复杂一点。您可以/应该编写一个XML模式来描述您提出的内容,这样您就可以使用标准验证工具、验证解析器等了。想到了两种可能性: 1-规则是否仅比较数值?在这种情况下,Xml可以工作
<Rules>
<Rule name="MyRule" left="3" operation=">" right="1" />
</Rules>
2-您还可以定义一个
存储您的检测策略。
一旦你发现了所有的
策略只是将
类并将其保存到文件系统
或者数据库。查看RuleML
RuleML(规则标记语言)是一种
统一XML序列化规则族
跨越所有领域的语言
与工业相关的网络类型
规则。它容纳并延伸
其他最新规则语言,建筑
它们之间的互操作桥梁。
RuleML的规范是
目前正在开发的版本
0.91到1.0版
也
规则标记计划的目标
将RuleML开发为规范
使用XML的规则Web语言
标记、形式语义和
高效的实现
RuleML涵盖了整个规则
频谱,从派生规则到
反应的转化规律
规则。因此,RuleML可以指定查询
网络本体论中的推理,
Web本体之间的映射,以及
工作流的动态Web行为,
服务和代理
这应该避免你重新发明轮子。此外,XML只是其中的一部分,如果您自己使用,还必须构建工具包
编辑:
还可以看看Drools(特定于Java)这类东西有标准,比如。不过看起来有点过分了。如果我理解了这个问题,您可以使用以下结构创建XML文件:
<root>
<rules>
<rule name="rule1" value="METRIC 1 > ThreShold 1" />
<rule name="rule2" value="METRIC 2 > ThreShold 2" />
</rules>
<connectors>
<port type="AND">
<value name="rule1" />
<value name="rule2" />
</port>
</connectors>
</root>
<> > >编辑:如果你需要解析规则值,你可以在XML中扩展value属性,然后用LINQ../P>解析它,而不是你的答案,但是你在使用.NET时,你可以使用微软工作流基金会来研究。这类东西正是它的设计目的。看起来像规范pattern@Guy:谢谢,但是对于这个非常简单的问题来说,这不是有点过分了吗?@Arseny:谢谢,但是以通用和可扩展的方式指定规则的问题仍然存在?是的,但我想这取决于这是你的全部问题还是你为我们简化了它。此外,如果规范发生了变化,您突然需要添加更多的规则或指标,WF可能会处理所有这些情况,而您仍然需要自己扩展XML解决方案。谢谢,这看起来不错。是的,它可以变得更复杂,但不会太复杂。不超过3个或4个门和1-2个深度级别。好的,将左侧和右侧设为门或度量,可以表示嵌套结构。您是指许可证文档吗?该链接是指向PDF的。您将被截获,必须单击“接受”。@保罗我也希望一些语言的设计与1970年代的战列坦克类似,但至少有人应该回顾一下已有的内容。doneYes,我并不反对您浏览该网站的想法——正如您所说,这个特定的轮子的一部分或全部可能已经发明出来了
class Port
{
public PortType Type
{
get;
set;
}
public IEnumerable<Rule> Rules
{
get;
set;
}
public Port(PortType type, IEnumerable<Rule> rules)
{
this.Type = type;
this.Rules = rules ?? Enumerable.Empty<Rule>();
}
}
enum PortType
{
AND,
OR
}
class Rule : IEquatable<Rule>
{
public string Value
{
get;
set;
}
public string Name
{
get;
set;
}
public Rule(string name, string value)
{
this.Name = name;
this.Value = value;
}
public bool Equals(Rule other)
{
return this.Name == other.Name;
}
public override int GetHashCode()
{
return this.Name.GetHashCode();
}
}
XDocument document = XDocument.Parse(xml);
XElement root = document.Root;
var rules = from rule in root.Element("rules").Elements()
let name = rule.Attribute("name").Value
let value = rule.Attribute("value").Value
select new Rule(name, value);
var ports = from port in root.Elements("connectors").Elements()
let portType = (PortType)Enum.Parse(typeof(PortType), port.Attribute("type").Value)
let portRules = from rule in port.Elements()
let name = rule.Attribute("name").Value
select new Rule(name, null)
select new Port(portType, rules.Intersect(portRules));