Необходимо удалять каждый экземпляр «score» после первого появления в каждой строке

#c# #asp.net #.net #xml #xpath

#c# #asp.net #.net #xml #xpath

Вопрос:

 <RepairOrderEvent>
      <EventType>Advisor - Shared Guidelines</EventType>
      <EventDateTime>2019-01-07T11:18:38.8756279-06:00</EventDateTime>
      <EventNotes>FAF: Refinish Time without Haz Waste or EPC Charge; Score: 11; Variance: 0.0; UniqueSequenceNum: 0; Insurance Score: 40</EventNotes>
    </RepairOrderEvent>
    <RepairOrderEvent>
      <EventType>Advisor - Shared Guidelines</EventType>
      <EventDateTime>2019-01-07T11:18:38.8756279-06:00</EventDateTime>
      <EventNotes>FAF(Best Practice): Must Enter If Vehicle is Drivable; Score: 11; Variance: 0.0; UniqueSequenceNum: 0</EventNotes>
    </RepairOrderEvent>
    <RepairOrderEvent>
      <EventType>Advisor - Shared Guidelines</EventType>
      <EventDateTime>2019-01-07T11:18:38.8756279-06:00</EventDateTime>
      <EventNotes>FAF(Best Practice): Bumper Overlap Prompt Answered Yes, No Estimate Line Note; Score: 11; Variance: 0.0; UniqueSequenceNum: 2; Insurance Score: 25</EventNotes>
    </RepairOrderEvent>
    <RepairOrderEvent>
      <EventType>Advisor - Shared Guidelines</EventType>
      <EventDateTime>2019-01-07T11:18:38.8756279-06:00</EventDateTime>
      <EventNotes>FAF(Document): Insufficient Photos Provided: Include Damage Area; Score: 11; Variance: 0.0; UniqueSequenceNum: 0; Insurance Score: 10000</EventNotes>
    </RepairOrderEvent>
  

У меня есть следующие XML-данные. Я пытаюсь найти совокупность «score», а не «score» «Insurance Score». Я думал об использовании Xpath, чтобы найти первое появление score в каждой строке и удалить оставшуюся часть строки. Конечная цель здесь — иметь возможность прочитать каждую строку для первого появления, удалить оставшуюся часть строки и найти сумму баллов.

Любые предложения или помощь приветствуются и ценятся. Спасибо!

Комментарии:

1. Если вы попытаетесь сделать это с помощью простого манипулирования строками, вы окажетесь в мире страданий. Просмотрите файл, используя технологию XML (DOM, Linq4Xml или что-то еще) и удалите атрибут.

2. Не могли бы вы решить эту проблему с помощью Regex? Или есть какое-то ограничение только на использование xpath? Регулярное выражение позволило бы вам извлекать все совпадения в формате: Score: ##; и вы могли бы суммировать их таким образом.

3. Если порядок элементов string статичен, вы можете использовать следующее выражение XPath-1.0 для получения Score значений: substring-before(substring-after(text(),'Score: '),';') . Оставшаяся задача — добавить результаты.

4. @dvo Никаких ограничений, это была всего лишь первоначальная мысль, и я обязательно попробую это сделать теперь, когда вы упомянули об этом.

5. @JVasquez0823 этот шаблон регулярных выражений может помочь: (?<=; Score: )[^;] это позитивный взгляд на прошлое. Он соответствует всему, что является «; Score: <что угодно с запятой>», но возвращает только искомое число. Вы можете использовать это, чтобы просмотреть совпадения регулярных выражений, проанализировать число и добавить его к текущему итогу. Попробуйте.

Ответ №1:

Как только вы дойдете до того, что будете обрабатывать значения EventNotes , вы могли бы сделать что-то вроде этого, предполагая, что у каждого EventNotes есть какой-то «Score».

   var num = eventNotes
    .Select(note => note
      .Split(";")
      .Where(part => part.Contains("Score"))
      .Select(score => int.Parse(score.Split(' ')[1]))
      .First())
    .Aggregate((sum, val) => sum   val);
  

Что дало бы вам сумму всех первых появлений score во всех примечаниях к событиям.
Это предполагает, что у вас уже есть часть синтаксического анализа XML.