Как извлечь точные значения из очень длинной строки c#

#c# #arrays #string

Вопрос:

Итак, у меня есть эта очень длинная строка

         <Type>3</Type>
      <X>1018</X>
      <Y>800</Y>
      <Delay>22</Delay>
    </MouseMovementEvent>
    <MouseMovementEvent>
      <Type>3</Type>
      <X>1014</X>
      <Y>805</Y>
      <Delay>22</Delay>
    </MouseMovementEvent>
    <MouseMovementEvent>
      <Type>3</Type>
      <X>1010</X>
      <Y>810</Y>
      <Delay>62</Delay>
    </MouseMovementEvent>
  </MouseMovement>
</MacroEvent>
<MacroEvent>
  <Type>2</Type>
  <MouseEvent>
    <MouseButton>1</MouseButton>
    <State>1</State>
  </MouseEvent>
</MacroEvent>
<MacroEvent>
  <Type>2</Type>
  <MouseEvent>
 

и так далее…

Как извлечь значения «x» и «y» в массив и [X, Y] и «задержку» в отдельный массив? C#

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

1. Ваша строка выглядит как xml — так что попробуйте ее проанализировать.

2. Да, по сути, это XML-файл, но я думал просто поместить его в одну строковую переменную 😀

Ответ №1:

Это можно легко сделать с помощью Linq to XML. Я попытался исправить данный фрагмент xml, чтобы он был допустимым XML.

Примечание: XElement также может загружать xml-файлы.

 XElement events = XElement.Parse(       @"<Root>
                                            <MacroEvent>  
                                              <MouseMovement>
                                                <MouseMovementEvent>
                                                  <Type>3</Type>
                                                  <X>1018</X>
                                                  <Y>800</Y>
                                                  <Delay>22</Delay>
                                                </MouseMovementEvent>
                                                <MouseMovementEvent>
                                                  <Type>3</Type>
                                                  <X>1014</X>
                                                  <Y>805</Y>
                                                  <Delay>22</Delay>
                                                </MouseMovementEvent>
                                                <MouseMovementEvent>
                                                  <Type>3</Type>
                                                  <X>1010</X>
                                                  <Y>810</Y>
                                                  <Delay>62</Delay>
                                                </MouseMovementEvent>
                                              </MouseMovement>
                                            </MacroEvent>
                                            <MacroEvent>
                                              <Type>2</Type>
                                              <MouseEvent>
                                                <MouseButton>1</MouseButton>
                                                <State>1</State>
                                              </MouseEvent>
                                            </MacroEvent>
                                          </Root>");


        IEnumerable<((int x, int y) coords, int delay)> movementEvents = from mouseMovementEvent in events.Descendants("MouseMovementEvent")
                                                        select ((Int32.Parse(mouseMovementEvent.Element("X").Value), Int32.Parse(mouseMovementEvent.Element("Y").Value)), Int32.Parse(mouseMovementEvent.Element("Delay").Value));

        (int x, int y)[] coords = movementEvents.Select(e => e.coords).ToArray();
        int[] delay = movementEvents.Select(e => e.delay).ToArray();