调整LINQ读取XML结构,实现多Condition组合同步校验构建结果
解决方案:调整LINQ查询适配XML结构变更并实现多Condition分组校验
新旧XML结构示例
旧格式
<BuildMachine name="MachineA"> <Process name="BuildProcess1"> <Conditions> <SuccessCriteria type="Contains">Build succeeded</SuccessCriteria> <Condition>Log line 1</Condition> <Condition>Log line 2</Condition> </Conditions> </Process> </BuildMachine>
新格式(调整后)
<BuildMachine name="MachineA"> <Process name="BuildProcess1"> <SuccessCriteria type="Contains">Build succeeded</SuccessCriteria> <Conditions> <Condition>Log line 1</Condition> <Condition>Log line 2</Condition> </Conditions> </Process> </BuildMachine>
修改后的LINQ查询代码
using System.Linq; using System.Xml.Linq; // 加载目标XML文件 var validationDoc = XDocument.Load("BuildValidationRules.xml"); // 查询并封装关联数据,实现同一Process下的Condition分组 var validationRules = validationDoc.Descendants("BuildMachine") .SelectMany(machineNode => machineNode.Descendants("Process") .Select(processNode => new { BuildMachine = machineNode.Attribute("name")?.Value, ProcessName = processNode.Attribute("name")?.Value, SuccessRule = new { MatchType = processNode.Element("SuccessCriteria")?.Attribute("type")?.Value, TargetText = processNode.Element("SuccessCriteria")?.Value.Trim() }, // 收集当前Process下的所有校验条件 CheckConditions = processNode.Descendants("Condition") .Select(cond => cond.Value.Trim()) .ToList() })) .ToList();
关键改动说明
- 层级遍历逻辑调整:直接从Process节点读取同级的SuccessCriteria,而非从原Conditions节点内读取,适配新的XML结构
- Condition分组实现:通过
Descendants("Condition")批量收集同一Process下的所有校验条件,避免拆分单独行 - 全量关联数据保留:将构建机器名、进程名、成功校验规则与条件列表绑定,确保日志校验时所有关联数据完整可用
内容的提问来源于stack exchange,提问作者Michele
相关产品推荐
相关产品推荐

