我不知道如何将某些XML表示为C#类。有没有人对如何正确映射这个xml有任何建议?以下是我的尝试:
<authenticationResponse>
<Accounts>
<AccountId>1</AccountId>
<AccountId>5</AccountId>
</Accounts>
</authenticationResponse>
public class authenticationResponse
{
[XmlElement("Accounts")]
[DataMember]
public List<Account> Accounts { get; set; }
}
public class Account
{
public long id { get; set; }
}
答案 0 :(得分:5)
Visual Studio 2012具有这个很酷的功能,称为“将XML粘贴为类”(在编辑&gt;选择性粘贴下)。您只需将XML复制到剪贴板中,这个“粘贴XML作为类”功能将为您生成并粘贴此authenticationResponse
类:
/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class authenticationResponse
{
private byte[] accountsField;
/// <remarks/>
[System.Xml.Serialization.XmlArrayAttribute()]
[System.Xml.Serialization.XmlArrayItemAttribute("AccountId", IsNullable = false)]
public byte[] Accounts
{
get
{
return this.accountsField;
}
set
{
this.accountsField = value;
}
}
}
答案 1 :(得分:3)
您可以通过LINQ to XML加载此数据:
XElement x = XElement.Load("YourFile.xml");
List<Account> accounts = x.Element("Accounts")
.Elements("AccountId")
.Select(e => new Account { id = (long)e })
.ToList();
在这种情况下,authenticationResponse
类是多余的。
如果您在内存中有响应(不在硬盘上的文件中),您可以使用:
string response = ...
XElement x = XElement.Load(new StringReader(response));
答案 2 :(得分:3)
您可以将XML反序列化为以下类:
[XmlRoot("authenticationResponse")]
public class AuthenticationResponse
{
[XmlArrayItem("AccountId")]
public List<long> Accounts { get; set; }
}
以下是反序列化的代码:
AuthenticationResponse response = null;
var serializer = new XmlSerializer(typeof(AuthenticationResponse));
using (StringReader sr = new StringReader(xml))
{
response = (AuthenticationResponse)serializer.Deserialize(sr);
}
答案 3 :(得分:2)
我不使用Visual Studio 2012,因此不要将Paste XML作为Class。但是,在这种情况下,如果我需要快速解决方案,我经常在Visual Studio工具中使用xsd.exe程序。它从XML模式定义(.xsd文件)生成C#类。
如果您没有针对相关XML的XSD,您可以从许多XML工具中快速生成一个XSD。我使用oXygen(可以使用试用版),加载XML示例,然后选择Tools |生成/转换架构。从长远来看,假设您不想依赖第三方工具,我坚持认为XML数据的来源也为我提供了Schema。
示例xsd.exe命令行(从Visual Studio命令提示符运行):
xsd.exe FileName.xsd /n:Namespace.Cust.App.UI /c
将生成一个名为FileName.cs的.cs文件。