3

一部の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

4 に答える 4

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;
        }
    }
}
于 2013-02-05T05:49:39.167 に答える
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));
于 2013-02-05T02:40:55.203 に答える
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); 
}
于 2013-02-05T04:22:09.730 に答える
2

私は Visual Studio 2012 を使用していないため、XML をクラスとして貼り付けることはできません。ただし、このような状況で迅速な解決策が必要な場合は、Visual Studio Tools の xsd.exe プログラムをよく使用します。XML スキーマ定義 (.xsd ファイル) から C# クラスを生成します。

問題の XML の XSD がない場合は、多数の XML ツールから XSD をすばやく生成できます。私は oXygen (試用版が利用可能です) を使用し、XML サンプルをロードして、[ツール] | [ツール] を選択します。スキーマを生成/変換します。長期的には、サードパーティのツールに依存したくないと仮定すると、XML データのソースもスキーマを提供してくれると主張したいと思います。

サンプル xsd.exe コマンド ライン (Visual Studio コマンド プロンプトから実行):

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

FileName.cs という名前の .cs ファイルが生成されます。

于 2013-02-05T13:13:57.890 に答える