0

在这里,我有以下 XML 数据:

<RepairOrderEvent>
    <EventType>Advisor - Repair Facility</EventType>
    <EventDateTime>2019-01-07T11:18:38.8756279-06:00</EventDateTime>
    <EventNotes>Weld-through primer is not included.; Rule Type: Estimate Line; Score: 1; Variance: 0.0; UniqueSequenceNum: 9</EventNotes>
</RepairOrderEvent>
<RepairOrderEvent>
    <EventType>Advisor - Shared Guidelines</EventType>
    <EventDateTime>2019-01-07T11:18:38.8756279-06:00</EventDateTime>    
    <EventNotes>FAF(Part):More cost effective approved Bumper Cover avail, SELECT or DOCUMENT CA; Score: 11; Variance: 402.14; UniqueSequenceNum: 2; Insurance Score: 250</EventNotes>
</RepairOrderEvent>
<RepairOrderEvent>
    <EventType>Advisor - Shared Guidelines</EventType>
    <EventDateTime>2019-01-07T11:18:38.8756279-06:00</EventDateTime>
    <EventNotes>FAF(Part):More cost effective approved Cert Headlamp avail, SELECT or DOC; Score: 11; Variance: 164.04; UniqueSequenceNum: 6; Insurance Score: 250</EventNotes>
</RepairOrderEvent>    
<RepairOrderEvent>
    <EventType>Advisor - Shared Guidelines</EventType>
    <EventDateTime>2019-01-07T11:18:38.8756279-06:00</EventDateTime>
    <EventNotes>FAF(Profile): LKQ Markup Exceeds Rate Guide; Score: 11; Variance: 24.8; UniqueSequenceNum: 0; Insurance Score: 10</EventNotes>
</RepairOrderEvent>

正如你们所看到的,有一个分数和保险分数。我只对“分数”以及旁边的数字感兴趣。
我需要创建一个运算符来获取 score 的值并吐出所有分数的总和(不包括保险分数)。

就做什么而言,我已经加载了 XML 文档,但在解析数据时遇到了困难。这里的最终目标是能够在第一次出现时读取每一行,删除其余的字符串并找到分数的总和。

这是我到目前为止的一些内容:

case "Aggregate": 
{
    XmlDocument currentWorkfileDoc = new XmlDocument();
    currentWorkfileDoc.LoadXml(currentWorkfileXML);

    foreach (XmlNode row in currentWorkfileDoc.SelectNodes("EventNotes"))
    {
        var rowName = row.SelectNodes("EventNote"); 
    }

    if (result)
        return result;
}
break;
4

1 回答 1

0

如果可以使用XDocument,则可以执行以下操作:

var currentWorkfileDoc = XDocument.Load(memoConfigFile);
var sum = (from item in currentWorkfileDoc.Elements("EventNotes")
            select Regex.Split(item.Value, @"\D+")[0]).Sum(x => int.Parse(x)); 

或根据需要尝试以下代码XmlDocument

XmlDocument currentWorkfileDoc = new XmlDocument();
currentWorkfileDoc.LoadXml(currentWorkfileXML); 
int sum = 0;
XmlNodeList elemList = currentWorkfileDoc.GetElementsByTagName("EventNotes");
for (int i = 0; i < elemList.Count; i++)
    sum += int.Parse(Regex.Split(elemList[i].Value, @"\D+")[0]);

更新:

我试过Regex会发现所有数字都是字符串数组,但是数组的第一个索引是""你应该把它作为第二个索引,比如Regex.Split(elemList[i].Value, @"\D+")[1].
在另一边,如果在 first 之前可能有数字,score您可以将元素基本Score:词的字符串和substring第二个拆分索引拆分为 first ;,例如:

foreach (var element in currentWorkfileDoc1.Descendants("EventNotes"))
{
    string[] strPart = element.Value.Split(new string[] { "Score:" }, StringSplitOptions.None);
    sum += int.Parse(strPart[1].Substring(0, strPart[1].IndexOf(';')));
}

注意:
您的xml文档没有任何root元素会导致加载它的问题XmlDocument我尝试了您的 XML 的第二个剪切代码,一切正常

<root>
<RepairOrderEvent>
    <EventType>Advisor - Repair Facility</EventType>
    <EventDateTime>2019-01-07T11:18:38.8756279-06:00</EventDateTime>
    <EventNotes>Weld-through primer is not included.; Rule Type: Estimate Line; Score: 1; Variance: 0.0; UniqueSequenceNum: 9</EventNotes>
</RepairOrderEvent> 
</root>
于 2019-03-11T16:36:24.063 回答