2016-12-21 14 views
0

保存されたxmlを特定のリストに読み込みたいと思います。現時点では、2つのSceneObjectを読み込むだけです。私は、XMLファイルが正しく構造化されているかどうか、またはこの時点でそのコードを100%確信しているわけではありません。誰かが私を正しい方向に向けるほど親切であれば、私はそれを感謝します。おそらく、3つのクラスを1つにまとめてXMLと、この時点でのコーディングレベルを少し上回る他のいくつかの可能性(linq)を作成することを検討しました。私はできることを学ぶプロジェクトを書いています。ありがとうございました!以下のXMLとコード。複数の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> 
+0

なぜXMLシリアル化を使用しないのですか。少数の明確なコードを使用してこのXMLを逆シリアル化することができます – Seminda

+0

ありがとう、私はそれを見上げます。 – user2079844

答えて

0

あなたがAutoMapperを使用してについて考えています。

XMLをリストにマップすることができることを示すScott Tobermanの良いコードプレフィックスtutorialがあります。それは少し日付がついていますが、概観をよくしています。 Stan Bashtavenkoの別のhereが役立つかもしれません。

もう1つの方法は、XSD.exeツールを使用してC#シリアル化を使用して、ckarrasのように必要なオブジェクト構造とXMLスキーマを生成することです。

+0

これを達成するにはいくつかの方法があるように見えますが、私はそれに取り掛かるつもりです。ありがとうございました! – user2079844

0

リストを作成する目的に応じて、DataTableを使用する方がよい場合があります。 DataSetはxmlファイルを読み書きし、データをDataTableに格納します。一度Datablesに、あなたはこの単純なステップここで私は、あなたが別のクラスにすることができます1つのクラスを使用し

1.Please Add using System.Xml as a reference; 
2.Make a class named book in this way 



    public class book 
      { 
       public Nullable<System.DateTime> date{ get; set; } 
       public decimal price { get; set; } 
       public string title { get; set; } 
       public string description { get; set; } 
     } 

    try 
       { 
        XmlDocument xmlDoc = new XmlDocument(); 
        xmlDoc.Load("Write down full path"); 
        XmlNodeList dataNodes = xmlDoc.SelectNodes("/catalog"); 

        foreach (XmlNode node in dataNodes) 
        { 
         book objbook = new book(); 
        objbook.date=Convert.ToDateTime(node.Attributes["date"].Value); 
         objbook.title=node.SelectSingleNode("title").InnerText; 
        objbook.description=node.SelectSingleNode("description").InnerText; 
objbook.price=Convert.ToDecimal(node.SelectSingleNode("price").InnerText); 

        } 

       } 
catch(Exception ex) 
{ 
throw ex; 
} 

に従うことができますあなたが望むしかし、データ、編集、表示、など

0

に作用することができます。シリアライズ時に、シリアライズされたデータを両方のクラスのオブジェクトに割り当てます。

関連する問題