2013-02-05 84 views
3

我不知道如何將一些XML表示爲C#類。有沒有人有任何建議,如何正確地映射這個XML?這是我下面嘗試:映射對類的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; } 
} 
+1

那麼,你有什麼問題? –

+0

我正在使用Microsoft Webapi從REST端點讀取數據。返回的xml正確地填充了accountids,但List中的對象是null。 – user486480

+0

請顯示完整的XML。 –

回答

3

您可以通過LINQ加載該數據到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

如果您從字符串而不是文件加載XML,請使用「XElement.Parse」。 –

+0

這行不能編譯:'Select'導致問題....選擇(e => new Account {id =(long)e}) – user486480

+0

@ user486480你得到了什麼錯誤? – horgh

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); 
} 
+0

謝謝,但這不適用於webapi authResponse = response.Content.ReadAsAsync ()。 – user486480

5

的Visual Studio 2012有這個所謂的「粘貼XML很酷的功能作爲類「(在編輯>選擇性粘貼下)。你可以簡單的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; 
     } 
    } 
} 
+0

這對我的其他課程來說是非常方便的。謝謝 – user486480

2

我不使用Visual Studio 2012因此不具備粘貼XML作爲類。但是,在這種情況下,如果我需要快速解決方案,我經常使用Visual Studio工具中的xsd.exe程序。它從XML模式定義(.xsd文件)生成一個C#類。

如果您沒有針對相關XML的XSD,則可以使用多種XML工具快速生成一個。我使用oXygen(有試用版),加載你的XML樣本,然後選擇工具|生成/轉換模式。從長遠來看,假設你不想依賴第三方工具,我堅持認爲XML數據的來源也爲我提供了一個Schema。

樣品XSD.EXE命令行(從Visual Studio命令提示符下運行):

xsd.exe FileName.xsd /n:Namespace.Cust.App.UI /c 

會產生所謂的FileName.cs一個cs文件。