将xml响应映射到类?

时间:2013-02-05 02:33:15

标签: c# xml asp.net-web-api

我不知道如何将某些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; }
}

4 个答案:

答案 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文件。