Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XML体系结构_C#_.net_Xml - Fatal编程技术网

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));