2016-01-27 3 views
1

У меня есть следующий класс, который содержит объекты класса, я хочу Deserialize xml. Я использую следующую технику, показывающую нуль. На самом деле я хочу Deserialize xml define в последней части вопроса. Для этой цели я использую следующий способ может быть я иду в неправильном направлении, пожалуйста, поправьте меняXml Deserialize return null

[Serializable] 
public class Param 
{ 
    public Professor Professor { get; set; } 
    public Course Course { get; set; } 
} 
public class Professor 
{ 
    public int id; 
    public String name; 

    public Professor() { } 
} 
public class Course 
{ 
    public int id; 
    public String name; 
    public Course() { } 
} 

Здесь folowing является C# код для десериализации XML-чтение из файла schedule.xml образца XML будет определять ниже

string path = "//schedule.xml"; 
    XmlRootAttribute xRoot = new XmlRootAttribute(); 
    xRoot.ElementName = "param"; 
    xRoot.IsNullable = true; 
    XmlSerializer serializer = new XmlSerializer(typeof(Param),xRoot); 
    using (StreamReader reader = new StreamReader(path)) 
    { 
    param = (Param)serializer.Deserialize(reader); 
    } 

Вот это образец XML, определенного в файле schedule.xml

<param> 
     <professor id='1' name='Novak J.'></professor> 
     <Professor id='2' name='Stanek A.'> </Professor> 
     <course id='1' name='Mathematics' biolab='false'> </course> 
     <course id='2' name='Biology' biolab='true'> </course> 
</param> 
+0

это ваш последний Xml? param является корневым тегом в вашем xml? Профессор и теги курса должны находиться под xml collection liek Professors and Courses .... возможно ли вам изменить вашу XML-структуру? – Viru

ответ

0

Измените классы, как это и попробуйте еще раз. Это код, сгенерированный VS для вашего xml. Я тестировал это, используя вашу структуру xml, и он работает. Но вам может понадобиться снова восстановить код для полного xml.

/// <remarks/> 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] 
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)] 
public partial class param 
{ 

    private paramProfessor professorField; 

    private paramProfessor1 professorField1; 

    private paramCourse[] courseField; 

    /// <remarks/> 
    public paramProfessor professor 
    { 
     get 
     { 
      return this.professorField; 
     } 
     set 
     { 
      this.professorField = value; 
     } 
    } 

    /// <remarks/> 
    public paramProfessor1 Professor 
    { 
     get 
     { 
      return this.professorField1; 
     } 
     set 
     { 
      this.professorField1 = value; 
     } 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute("course")] 
    public paramCourse[] course 
    { 
     get 
     { 
      return this.courseField; 
     } 
     set 
     { 
      this.courseField = value; 
     } 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] 
public partial class paramProfessor 
{ 

    private byte idField; 

    private string nameField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public byte id 
    { 
     get 
     { 
      return this.idField; 
     } 
     set 
     { 
      this.idField = value; 
     } 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public string name 
    { 
     get 
     { 
      return this.nameField; 
     } 
     set 
     { 
      this.nameField = value; 
     } 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] 
public partial class paramProfessor1 
{ 

    private byte idField; 

    private string nameField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public byte id 
    { 
     get 
     { 
      return this.idField; 
     } 
     set 
     { 
      this.idField = value; 
     } 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public string name 
    { 
     get 
     { 
      return this.nameField; 
     } 
     set 
     { 
      this.nameField = value; 
     } 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] 
public partial class paramCourse 
{ 

    private byte idField; 

    private string nameField; 

    private bool biolabField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public byte id 
    { 
     get 
     { 
      return this.idField; 
     } 
     set 
     { 
      this.idField = value; 
     } 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public string name 
    { 
     get 
     { 
      return this.nameField; 
     } 
     set 
     { 
      this.nameField = value; 
     } 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public bool biolab 
    { 
     get 
     { 
      return this.biolabField; 
     } 
     set 
     { 
      this.biolabField = value; 
     } 
    } 
} 
0

Ваш образец XML:

<param> 
     <professor id='1' name='Novak J.'></professor> 
     <professor id='2' name='Stanek A.'> </professor> 
     <course id='1' name='Mathematics' biolab='false'> </course> 
     <course id='2' name='Biology' biolab='true'> </course> 
</param> 

сериализуемый класс:

[XmlRoot(Namespace = "", ElementName = "param")] 
public class Param 
{ 
    [XmlElement("professor")] 
    public List<professor> Professor { get; set; } 
    [XmlElement("course")] 
    public List<course> Course { get; set; } 
} 
public class professor 
{ 
    [XmlAttribute("id")] 
    public int professorid; 
    [XmlAttribute("name")] 
    public string professorname; 

    public professor() { } 
} 
public class course 
{ 
    [XmlAttribute("id")] 
    public int courseid; 
    [XmlAttribute("name")] 
    public string coursename; 

    public course() { } 
} 

Вызов кода десериализации:

DeserializeFromXml<Param>(XMLinStringVariable); 

C# код для десериализации:

public static T DeserializeFromXml<T>(string xml) 
{ 
    try 
    { 
     T result; 
     XmlSerializer ser = new XmlSerializer(typeof(T)); 
     using (TextReader tr = new StringReader(xml)) 
     { 
      result = (T)ser.Deserialize(tr); 
     } 
     return result; 
    } 
    catch { throw; } 
} 

Редактировать: Ошибка заключается в том, что оба <professor> и <course> тег используют одни и те же имена атрибутов. Поэтому я добавил XmlElement и XmlAttribute теги в классе сериализации для их раздвоения.

+0

его все еще возвращает null ..... – user5841941

+0

Я внес изменения и проверил их сам. Это работает! P.S: Изменения были в классе сериализации. – SanyTiger

0

Вы должны пометить id и имя как атрибут XML в классе, чтобы значения были выбраны во время desrialzation. Я также изменил ваш XML. Взгляните ниже

static void Main(string[] args) 
    { 
     string xml = File.ReadAllText(path of the file); 
     Param p = DeserializeFromXml<Param>(xml); 
    } 

    public static T DeserializeFromXml<T>(string xml) 
    { 
     try 
     { 
      T result; 
      XmlSerializer ser = new XmlSerializer(typeof(T)); 
      using (TextReader tr = new StringReader(xml)) 
      { 
       result = (T)ser.Deserialize(tr); 
      } 
      return result; 
     } 
     catch { throw; } 
    } 

} 

[Serializable] 
[XmlRoot(Namespace = "", ElementName = "param")] 
public class Param 
{ 
    [XmlArray("professors")] 
    public List<professor> Professor { get; set; } 
    [XmlArray("courses")] 
    public List<course> Course { get; set; } 
} 
public class professor 
{ 
    [XmlAttribute("id")] 
    public int id { get; set; } 
    [XmlAttribute("name")] 
    public string name { get; set; } 



    public professor() { } 
} 
public class course 
{ 
    [XmlAttribute("id")] 
    public int id { get; set; } 
     [XmlAttribute("name")] 
    public string name { get; set; } 

    public course() { } 
} 

Новый XML

<param> 
<professors> 
     <professor id='1' name='Novak J.'></professor> 
     <professor id='2' name='Stanek A.'> </professor> 
</professors> 
<courses> 
     <course id='1' name='Mathematics' biolab='false'> </course> 
     <course id='2' name='Biology' biolab='true'> </course> 
</courses> 
</param>