将 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; }
}
我关注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; }
}