2017-02-23 3 views
0

なぜ私はこれに立ち往生しているのかわかりませんが、ここで何か助けが必要です。私は複数のプロパティを持つ複数のクラスを持っています。私は、以下に述べるこの方法を使ってXMLファイルを解析しようとしています。C#でXML構文解析関数にクラス名を渡すには?

private void button_Click(object sender, RoutedEventArgs e) 
     { 

      string XMLFilePath = Path.Combine(Package.Current.InstalledLocation.Path, "UTC34.xml"); 
      //string data = await FileIO.ReadTextAsync(file); 

      if(File.Exists(XMLFilePath)) 
      { 

       FileStream fs = new FileStream(XMLFilePath, FileMode.Open, FileAccess.Read); 

       TextReader ff = new StreamReader(fs); 
       XDocument xmldoc = XDocument.Parse(ff.ReadToEnd()); 
       XmlSerializer ser1 = new XmlSerializer(typeof(FlightPlan)); 
       using (var reader = xmldoc.CreateReader()) 
       { 
        var serializer = new XmlSerializer(typeof(FlightPlan)); 
        FlightPlan someTest = serializer.Deserialize(reader) as FlightPlan; 
        // NotSupportedException here (as inner exception) 
       } 


      } 

私はここに

のXmlSerializer SER1 =新しいXmlSerializerを(typeof演算(フライトプラン))をアップ立ち往生しています; //フライトプランは、私がここで私の方法を書きたいクラス

です私はXMLファイル内に複数のクラスがあるので、クラス名を渡します。複数のクラスに対して複数の関数を記述したくありません。

どうすれば実現できますか?

+0

これはボタンをクリックすると発生します。その時点でどのクラスを使用するのかはどのように分かりますか? –

+0

@JonSkeet jon私はPOCに取り組んでいます。私はC#クラスを生成した大きなXMLファイルを持っています.1つのXMLファイルには複数のクラスがあり、データは決して変更されません。私はちょうど1つの関数を呼び出すことができると思っていたし、すべてのXMLデータをそれらのクラスにシリアライズします。どうやってやるの? – Apoorv

+0

あなたの質問は非常に不明です。 2つのクラス(それぞれただ1つのプロパティを持つ)といくつかの代表的なXML、そしてXMLを生成したコンソールアプリケーションとそれを解析しようとしたものを[mcve]に提供する方がずっと良いでしょう。 –

答えて

0

ここでは、xmlシリアル化に使用するコードスニペットを示します。

public static class Serializer<T> where T : class 
{ 
    public static void Serialize(string filename, T obj) 
    { 
     using (TextWriter WriteFileStream = new StreamWriter(filename, false)) 
     { 
      XmlSerializer SerializerObj = new XmlSerializer(typeof(T)); 
      SerializerObj.Serialize(WriteFileStream, obj); 
     } 
    } 

    public static T Deserialize(string filename) 
    { 
     if (File.Exists(filename)) 
     { 
      using (FileStream fs = new FileStream(filename, FileMode.Open)) 
      { 
       XmlSerializer SerializerObj = new XmlSerializer(typeof(T)); 

       using (XmlReader reader = new XmlTextReader(fs)) 
       { 
        if (SerializerObj.CanDeserialize(reader)) 
        { 
         return SerializerObj.Deserialize(reader) as T; 
        } 
       } 
      } 
     } 

     return null; 
    } 
} 

複数のクラスに合格するには、UPDATE

、あなたは他の人が含まれている別のクラスを作成する必要があります。

string classname = typeof(FlightPlan).Name; 

それとも

this.GetType().Name 

パラメータとしてこれを渡すか、または種類に.NAMEを呼び出す:

[Serializable] 
class Container 
{ 
    public MyClass1 One { get; set; } 
    public MyClass2 Two { get; set; } 
} 

[Serializable] 
class MyClass1 
{ 

} 

[Serializable] 
class MyClass2 
{ 

} 

それから私はこのようにそれを使用

static void Main(string[] args) 
    { 
     Serializer<Container>.Serialize("path", new Container()); 
    } 
+0

複数のクラス名を渡すにはどうすればいいですか?私は大きなXMLファイルをC#クラスに変換しました。変換されたC#クラスファイルは50のクラスを有する。私はシリアル化することができるように、それらの50のすべての名前を単一の関数に渡す必要があります。手伝ってくれますか ? – Apoorv

+0

シリアライザは、デシリアライズしているルートオブジェクトのプロパティに基づいてこれを独自に処理します。上記の例のように、ルートオブジェクトタイプを指定するだけです(Tをタイプに置き換えてください)。 –

+0

アップデート –