【发布时间】:2017-05-06 08:49:38
【问题描述】:
我想将保存的 xml 加载到特定列表中。目前,它只是加载了 2 个场景对象。在这一点上,我不能 100% 确定 xml 文件的结构或代码是否正确。如果有人愿意为我指出正确的方向,我将不胜感激。我已经研究过可能将 3 个类组合成 1 个类来创建 xml 和其他一些可能性(linq),这些可能性目前有点超出我的编码水平。我正在写项目来学习我能做的。谢谢! XML 和代码如下。
代码:
private void btnOpenFile_Click(object sender, EventArgs e)
{
Stream myStream = null;
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
openFileDialog1.Filter = "XML Files (*.xml)|*.*";
openFileDialog1.FilterIndex = 1;
openFileDialog1.RestoreDirectory = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
try
{
if ((myStream = openFileDialog1.OpenFile()) != null)
{
using (myStream)
{
//create the XmlReaderSettings object
XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreWhitespace = true;
settings.IgnoreComments = true;
//create the xml reader object
XmlReader xmlIn = XmlReader.Create(myStream, settings);
//read past all nodes until the first SceneObject node
if (xmlIn.ReadToDescendant("SceneObject"))
{
//create one waypoint object for each node
do
{
SceneObject sceneObject = new SceneObject();
xmlIn.ReadStartElement("SceneObject");
sceneObject.RunMethod = xmlIn.ReadElementContentAsString();
sceneObject.Name = xmlIn.ReadElementContentAsString();
sceneObject.Paint = xmlIn.ReadElementContentAsString();
sceneObject.Latitude = xmlIn.ReadElementContentAsDouble();
sceneObject.Longitude = xmlIn.ReadElementContentAsDouble();
sceneObject.Altitude = xmlIn.ReadElementContentAsInt();
sceneObject.Pitch = xmlIn.ReadElementContentAsDouble();
sceneObject.Bank = xmlIn.ReadElementContentAsDouble();
sceneObject.Heading = xmlIn.ReadElementContentAsDouble();
sceneObject.OnGround = Convert.ToByte(xmlIn.ReadElementContentAsString());
sceneObject.Airspeed = Convert.ToUInt32(xmlIn.ReadElementContentAsString());
sceneObjectList.Add(sceneObject);
}
while (xmlIn.ReadToNextSibling("SceneObject"));
}
//read past all nodes until the first Waypoint node
if (xmlIn.ReadToDescendant("Waypoint"))
{
//create one waypoint object for each node
do
{
Waypoint waypoint = new Waypoint();
xmlIn.ReadStartElement("Waypoint");
waypoint.Id = xmlIn.ReadElementContentAsInt();
waypoint.Flags = Convert.ToUInt32(xmlIn.ReadElementContentAsString());
waypoint.Latitude = xmlIn.ReadElementContentAsDouble();
waypoint.Longitude = xmlIn.ReadElementContentAsDouble();
waypoint.Altitude = xmlIn.ReadElementContentAsDouble();
waypoint.Speed = xmlIn.ReadElementContentAsDouble();
waypoint.Count = xmlIn.ReadElementContentAsInt();
wayPointList.Add(waypoint);
}
while (xmlIn.ReadToNextSibling("Waypoint"));
}
//read past all nodes until the first FlightPlan node
if (xmlIn.ReadToDescendant("FlightPlan"))
{
//create one flightplan object for each node
do
{
FlightPlan flightPlan = new FlightPlan();
xmlIn.ReadStartElement("FlightPlan");
flightPlan.Name = xmlIn.ReadElementContentAsString();
flightPlan.Paint = xmlIn.ReadElementContentAsString();
flightPlan.Flight = xmlIn.ReadElementContentAsString();
flightPlanList.Add(flightPlan);
}
while (xmlIn.ReadToNextSibling("FlightPlan"));
}
xmlIn.Close();
}
}
}
catch (Exception ex)
{
MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message, "FlighT");
}
}
}
XML:
<?xml version="1.0" encoding="utf-8"?>
<Scene>
<SceneObjects>
<SceneObject>
<RunMethod>AICreateSimulatedObjectVehicle</RunMethod>
<Name>Veh_Air_BagTractor_Euro_White_sm</Name>
<Paint />
<Latitude>55.3579907547104</Latitude>
<Longitude>-131.714398095813</Longitude>
<Altitude>92</Altitude>
<Pitch>0</Pitch>
<Bank>0</Bank>
<Heading>111</Heading>
<Onground>1</Onground>
<Airspeed>0</Airspeed>
</SceneObject>
<SceneObject>
<RunMethod>AICreateSimulatedObjectVehicle</RunMethod>
<Name>VEH_Air_BagLoaderGrey</Name>
<Paint />
<Latitude>55.3579907547104</Latitude>
<Longitude>-131.714398095813</Longitude>
<Altitude>92</Altitude>
<Pitch>0</Pitch>
<Bank>0</Bank>
<Heading>111</Heading>
<Onground>1</Onground>
<Airspeed>0</Airspeed>
</SceneObject>
</SceneObjects>
<Waypoints>
<Waypoint>
<Id>1</Id>
<Flags>4</Flags>
<Latitude>55.3579907547104</Latitude>
<Longitude>-131.714398095813</Longitude>
<Altitude>92</Altitude>
<Speed>12</Speed>
<Count>0</Count>
</Waypoint>
<Waypoint>
<Id>1</Id>
<Flags>4</Flags>
<Latitude>55.3579907547104</Latitude>
<Longitude>-131.714398095813</Longitude>
<Altitude>92</Altitude>
<Speed>12</Speed>
<Count>1</Count>
</Waypoint>
</Waypoints>
<FlightPlans>
<FlightPlan>
<Name>Beech_King_Air_350</Name>
<Paint>Beech King Air 350 Paint1</Paint>
<Flight>IFR Ketchikan Intl to Annette Island</Flight>
</FlightPlan>
</FlightPlans>
</Scene>
【问题讨论】:
-
为什么不使用 XML 序列化。您可以使用几行清晰的代码反序列化此 XML
-
谢谢,我会查查的。
标签: c# xml xml-parsing