2016-01-27 64 views
1

我有以下类包含类的对象我想反序列化XML。我正在使用以下技术显示为空。其实我想在问题的最后部分反序列化xml定义。为此,我用下面的技术可我要去的方式不对请指正Xml反序列化返回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() { } 
} 

这里如下因素是C#代码反序列化的XML从XML文件schedule.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); 
    } 

这里这是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集合里面教授和课程....是否可以让你改变你的XML结构? – Viru

回答

0
定义

改变你的类像这样,然后再试一次XML的样品。这是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>标签使用相同的属性名称。所以我在序列化类中添加了XmlElementXmlAttribute标记以将它们分叉。

+0

它仍然返回空..... – user5841941

+0

我已经做了更改,并自己检查它们。这工作! P.S:这些更改是在序列化类中的。 – SanyTiger

0

您必须在类中将id和名称标记为XML Attribute,以便在解序列化过程中采集值。我也重组了你的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>