【发布时间】:2010-12-31 16:56:04
【问题描述】:
我有以下 XML 文件:
<?xml version="1.0" encoding="utf-8" ?>
<strategies>
<strategy name="God Class">
<gate type="AND">
<rule>
<metric>LOC</metric>
<comparison>greater than</comparison>
<value>850</value>
</rule>
<rule>
<metric>FANIN</metric>
<comparison>greater than</comparison>
<value>850</value>
</rule>
<rule>
<metric>FANOUT</metric>
<comparison>greater than</comparison>
<value>850</value>
</rule>
</gate>
</strategy>
<strategy name="TClass">
<gate type="OR">
<gate type="AND">
<rule>
<metric>LOC</metric>
<comparison>greater than</comparison>
<value>100</value>
</rule>
<rule>
<metric>NOM</metric>
<comparison>greater than</comparison>
<value>200</value>
</rule>
</gate>
<rule>
<metric>NOPAR</metric>
<comparison>greater than</comparison>
<value>300</value>
</rule>
</gate>
</strategy>
</strategies>
现在我尝试解析这个文档并提取规则。第一个策略很简单,代码如下:
public static void parseRules()
{
XDocument document = XDocument.Load(FILE);
XElement root = document.Root;
foreach (XElement elem in root.Elements())
{
String name = elem.Attribute(STRATEGY_NAME).Value;
XElement gate = elem.Element(GATE_NAME);
List<Rule> rules = new List<Rule>();
foreach (XElement r in gate.Elements())
{
String metric = r.Element(METRIC_NAME).Value;
String comparisation = r.Element(COMPARISON_NAME).Value;
int threshold = Convert.ToInt32(r.Element(VALUE_NAME).Value);
Rule rule = null;
if (comparisation.Equals(GREATER_THAN_NAME))
{
rule = new Rule(metric, Rule.GREATHER_THAN, threshold);
}
else if (comparisation.Equals(SMALLER_THAN_NAME))
{
rule = new Rule(metric, Rule.SMALLER_THAN, threshold);
}
rules.Add(rule);
}
ISpecification spec = rules.ElementAt(0);
if (gate.Attribute(TYPE_NAME).Value.Equals(AND))
{
for (int i = 1; i < rules.Count; i++)
{
spec = spec.And(rules.ElementAt(i));
}
}
else if (gate.Attribute(TYPE_NAME).Value.Equals(OR))
{
for (int i = 1; i < rules.Count; i++)
{
spec = spec.Or(rules.ElementAt(i));
}
}
DetectionStrategy strategy = new DetectionStrategy(spec, name);
}
}
}
显然,这仅适用于在一个门中只有规则的 XML 文件,而不是第二个示例中的另一个门。但是我无法解析嵌套的门。任何提示从哪里开始?
【问题讨论】: