【问题标题】:Map XML child element to C# class将 XML 子元素映射到 C# 类
【发布时间】:2015-09-09 07:07:35
【问题描述】:

我有以下 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 H结果=-2146233079 Message= 不是预期的。 Source=Microsoft.GeneratedCode

对象类是:

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; }
}    

【问题讨论】:

  • 不清楚的地方The 'data' start tag on line 1 position 73 does not match the end tag of 'root'. Line 1, position 167.

标签: c# .net xml xml-serialization xmlserializer


【解决方案1】:

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

[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; } 
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 2021-02-02
    • 2014-03-14
    相关资源
    最近更新 更多