簡體   English   中英

Xml Deserialize返回null

[英]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>標記都使用相同的屬性名稱。 因此,我在序列化類中添加了XmlElementXmlAttribute標記以對它們進行分叉。

您必須在類中將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM