我有一个很大的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对其进行解析的原因。 另外,我也不知道解析它的最佳方法,因此我以自己喜欢的顺序拥有数据(每个框架都由所有人组成,而不是每个人的每一半都有其框架)
希望您能帮助我解决这个问题。 预先感谢!
答案 0 :(得分:0)
您的问题对您想要的确切输出有些困惑。我相信,执行此操作最快的方法是使用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;
}
}
}