[英]Xml Deserialize return null
我有下面的類,其中包含我要反序列化xml的類的對象。 我正在使用以下技術顯示為空。 實際上,我想對問題的最后一部分中的xml定義進行反序列化。 為此,我使用以下技術可能是我走錯了路,請糾正我
[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#代碼,從文件schedule.xml讀取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);
}
這是schedule.xml文件中定義的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>
像這樣更改您的課程,然后重試。 這是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;
}
}
}
您的示例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
標記以對它們進行分叉。
您必須在類中將id和name標記為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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.