2017-07-18 12 views
1

属性と要素の両方をカウントするXML構造が与えられている場合、System.Xml.Serialization属性を使用してC#クラスを構築するにはどうすればよいですか?私のXMLは次のようになります属性と値の両方を持つ要素を逆シリアル化する

<Accounts> 
    <Number credit="1000">100987654321</Number> 
    <Number credit="0" >100987654322</Number> 
<Accounts> 

私は、このクラス構造をしようとしているが、それはXMLを受け入れません。

public class Customer 
{ 
    [DataMember, XmlArrayItem(ElementName = "Accounts")] 
    public AccountNumber[] AccountNumbers; 
} 

public class AccountNumber 
{ 
     [DataMember, XmlElement(ElementName = "Number")] 
     public string AccountNumber; 

     [DataMember, XmlAttribute(AttributeName = "credit")] 
     public int Credit; 
} 

「ナンバー」要素にネストされた数字の配列を持たないというのは難しいことです。私たちはしばしば、例えば、次のようにHTMLのあなたは、おそらくいくつかのスタイリングとタグを持つタグ、および

"... height=12px> value </..." 

答えて

2

で実際の値AccountNumberクラスが定義することができます

public class AccountNumber 
{ 
    [XmlText] 
    public string Number { get; set; } 

    [XmlAttribute(AttributeName = "credit")] 
    public int Credit { get; set; } 
} 

これは、属性をもたらし、要素のテキストを正しくデシリアライズします。

PS。 AccountNumberNumberに変更する必要がありました。これは、そうでなければコンパイルされないためで、DateTimeからintまでの属性は明らかに日付/時刻ではありません。

[XmlRoot("Accounts")] 
public class Accounts 
{ 
    [XmlElement(ElementName = "Number")] 
    public AccountNumber[] AccountNumbers; 
} 

とテスト「プログラム」自体::あまりにもあなたCustomerクラスを修正する必要が

あなたはおそらく、私がテストするには、次を使用

static void Main(string[] args) 
{ 
    string str = @"<Accounts><Number credit=""1000"">100987654321</Number><Number credit=""0"">100987654322</Number></Accounts>"; 

    using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(str))) 
    { 
     XmlSerializer ser = new XmlSerializer(typeof(Accounts)); 
     var result = (Accounts)ser.Deserialize(stream); 
    } 
} 
+0

は、私はあなたのソリューションを使用し、ありがとうそれは完全に動作します - その人が私の注意をいかにしぼったかわかりません;)あなたはクレジットタイプについて絶対に正しいです、私はポストでそれを変更しました。再度、感謝します! –

関連する問題