Как загрузить / разобрать огромные XML-данные и упорядочить их порядок - PullRequest
0 голосов
/ 26 октября 2018

У меня есть большой XML-файл, который я хочу проанализировать в различных переменных с помощью C #.XML выглядит следующим образом:

<PutDataRequest RequestId="XGR172DBES" MessageTime="2018-03-20T14:17:33.404+02:00" TransmissionComplete="true" TransmissionSuspended="false">
    <Positions EventTime="2017-07-15T15:10:13.280+02:00">
        <MetaData MatchId="MAT-1238TN" Type="pitch-size">
            <PitchSize X="125.00" Y="45.00"/>
        </MetaData>
        <FrameSet GameSection="secondHalf" MatchId="MAT-1238TN" TeamId="ZTU-012302" PersonId="OBJ-0054T8">
            <Frame N="132874" T="2017-07-15T15:55:35.680+02:00" X="3.66" Y="-35.02" S="0.00" D="0.00" A="0.00" M="67"/>
            <Frame N="132875" T="2017-07-15T15:55:36.680+02:00" X="3.68" Y="-36.02" S="0.00" D="0.00" A="0.00" M="67"/>

            ....
        </FrameSet>
        <FrameSet GameSection="secondHalf" MatchId="MAT-1238TN" TeamId="ZTU-012302" PersonId="OBJ-0016ZT">
                <Frame N="127912" T="2017-07-15T15:53:17.680+02:00" X="0.80" Y="-31.55" S="0.00" D="0.00" A="0.00" M="64"/>

                ...
        </FrameSet>
        <FrameSet GameSection="firstHalf" MatchId="MAT-1238TN" TeamId="ZTU-00134E" PersonId="OBJ-0012TZ">
            <Frame N="10001" T="2017-07-15T14:30:17.680+02:00" X="20.22" Y="10.92" S="0.00" D="0.00" A="0.00" M="1"/>

            ...
        </FrameSet>

Цель состоит в том, чтобы в каждом кадре были все люди с указанными там переменными teamid и X, Y и S.Каково лучшее решение для этого?Моя проблема в том, что я не могу даже открыть файл на моем настольном компьютере должным образом, потому что, если я прокручиваю вниз или вверх, чтобы искать что-то, это всегда занимает некоторое время.Вот почему я боюсь просто проанализировать его с помощью XML Lynq из-за длительного времени загрузки.Также я не знаю, как это лучше всего проанализировать, поэтому у меня есть данные в том порядке, в котором они мне нравятся (каждый кадр со всеми людьми, а не каждый человек для каждой половины со своими кадрами)

Надеюсь, вы можете помочь мне решить эту проблему.Заранее спасибо!

1 Ответ

0 голосов
/ 26 октября 2018

Ваш вопрос немного сбивает с толку именно тот результат, который вы желаете.Я считаю, что самый быстрый способ сделать это - использовать XmlTextReader, который предназначен только для пересылки и очень быстр.Ниже приведен пример того, как его использовать;это может не совсем соответствовать вашим требованиям (опять же, их трудно понять), но это должно дать вам начало.

Мой пример дает вам список всех людей и их фреймов.

//define a couple of classes to hold people and frames
public class Person
{
    public string PersonId { get; set; }
    public string TeamId { get; set; }
    public List<Frame> Frames { get; set; }

    public Person()
    {
        Frames = new List<Frame>();
    }
}

public class Frame
{
    public string N { get; set; }
    public string X { get; set; }
    public string Y { get; set; }
    public string S { get; set; }
}

Теперь мы будем читать в классы, используя XmlTextReader:

XmlTextReader reader = new XmlTextReader(@"c:\temp\frames.xml");
var people = new List<Person>();
var person = new Person();

while (reader.Read())
{
    if (reader.IsStartElement())
    {
        switch (reader.Name)
        {
            case "FrameSet":
                var id = reader.GetAttribute("PersonId");
                if (!people.Any(p => p.PersonId == id))
                {
                    person = new Person { PersonId = id, TeamId = reader.GetAttribute("TeamId") };
                    people.Add(person);
                }
                else
                {
                    person = people.First(p => p.PersonId == id);
                }
                break;
            case "Frame":
                var n = reader.GetAttribute("N");
                var x = reader.GetAttribute("X");
                var y = reader.GetAttribute("Y");
                var s = reader.GetAttribute("S");
                person.Frames.Add(new Frame { N = n, X = x, Y = y, S = s });
                break;                        
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...