2017-02-23 2 views
0

Я не знаю, почему я застрял в этом, но мне нужна помощь здесь. У меня есть несколько классов с несколькими свойствами. Я пытаюсь проанализировать XML-файл, используя этот метод, упомянутый ниже.Как передать имя класса функции XML Parsing в C#?

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 (Flightplan)); // Flightplan представляет собой класс

Я хочу написать метод, в котором я pas они Classname, поскольку в XML-файле есть несколько классов. Я не хочу писать несколько функций для нескольких классов.

Как я могу это достичь?

+0

Ну, это произойдет в ответ на нажатие кнопки - как вы знаете, какой класс использовать в этот момент? –

+0

@JonSkeet jon Я работаю над POC. У меня есть большой XML-файл, для которого я genereated классы C#, один XML-файл имеет несколько классов, и данные никогда не меняются. Я просто думал, что можно вызвать только одну функцию, и она сериализует все данные XML в эти классы. Как мне это сделать? – Apoorv

+0

Ваш вопрос очень неясен. Было бы намного лучше, если бы вы предоставили [mcve] - с двумя классами (только с одним свойством каждый) и некоторым представительным XML, а затем консольным приложением, которое создало XML и что вы пытались его разобрать. –

ответ

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

Чтобы пройти в нескольких классах, вы должны создать еще один класс, который содержит другие.

[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

Сериализатор работает с этим самостоятельно, основываясь на свойствах объекта root, который вы десериализуете. Вам нужно только предоставить ему тип объекта root, как в приведенном выше примере (замените T на ваш тип) –

+0

См. Обновление –

0

Я использую это так:

string classname = typeof(FlightPlan).Name; 

Или

this.GetType().Name 

проходят это в качестве параметра или вызвать .name по типу.