将 XML 子元素映射到 C# class

Map XML child element to C# class

我关注XML:

        xml += "<?xml version=\"1.0\" encoding=\"UTF - 8\"?>";
        xml += "<root>";
        xml += " <success>true</success>";
        xml += " <data>";
        xml += "   <item>";
        xml += "     <StateId>0</StateId>";
        xml += "     <StateName>Test</StateName>";
        xml += "     <GroupId>0</GroupId>";
        xml += "   </item>";
        xml += " </data>";
        xml += "</root>";

基本上我只对 root->data->item 元素感兴趣,我正在尝试获取它:

public static T ConvertXmlToClass<T>(string xml)
{
    XmlRootAttribute xRoot = new XmlRootAttribute();
    xRoot.ElementName = "root";
    xRoot.IsNullable = true;
    var serializer = new XmlSerializer(typeof(T), xRoot);
    return (T)serializer.Deserialize(new StringReader(xml));
}

我得到的是空对象,因为实际数据在 root->data->item 中。

我尝试将 xRoot.ElementName = "root"; 更改为 xRoot.ElementName = "root/data";xRoot.ElementName = "root/data/item"; 但我得到了:

InnerException: System.InvalidOperationException HResult=-2146233079 Message= was not expected. Source=Microsoft.GeneratedCode

对象class是:

public partial class DocumentStatus
{
    public DocumentStatus()
    {
        this.Documents = new HashSet<Document>();
        this.DocumentsTrackings = new HashSet<DocumentsTracking>();
        this.DocumentsTrackingChildDocuments = new HashSet<DocumentsTrackingChildDocument>();
    }
    [XmlElement("StateId")]
    public int StateId { get; set; }
    [XmlElement("StateName")]
    public string StateName { get; set; }
    [XmlElement("GroupId")]
    public Nullable<int> GroupId { get; set; }

    public virtual HashSet<Document> Documents { get; set; }
    public virtual HashSet<DocumentsTracking> DocumentsTrackings { get; set; }
    public virtual HashSet<DocumentsTrackingChildDocument> DocumentsTrackingChildDocuments { get; set; }
}    

您应该修复 类 以便您的序列化有效:

[Serializable()]
[System.Xml.Serialization.XmlRoot("root")]
public class SomeClass
{
     public Data()
    {
        DataArray = new List<Data>(); 
    }

    [XmlElement("data", typeof(Data))]
    public List<Data> DataArray { get; set; }
} 

[Serializable()]
public class Data
{
    public Data()
    {
        DocumentStatusArray = new List<DocumentStatus>(); 
    }

    [XmlElement("item", typeof(DocumentStatus))]
    public List<DocumentStatus> DocumentStatusArray { get; set; }
} 

[Serializable()]
public class DocumentStatus
{
    [System.Xml.Serialization.XmlAttribute("StateId")]
    public int StateId {get; set;}

    [System.Xml.Serialization.XmlAttribute("StateName")]
    public string StateName { get; set; }

    [System.Xml.Serialization.XmlAttribute("GroupId")]
    public GroupId groupId { get; set; } 
}