web-dev-qa-db-ja.com

asp.netシリアル化を使用して、値と属性を持つxmlノードを逆シリアル化する方法

私は、着信xmlポーリングからxmlをデシリアライズし、使用可能なクラスにポーリングを構築するために4つの小さなクラスを持っています。

これで、クラスからプロパティを設定し、xmlの特定の属性または要素に一致させる方法がわかります。その要素が簡単な文字列である場合、要素に次の例のような属性がある場合はどうなりますか?

<Questions>
 <Question id="a guid">
  <AnswerItems>
   <AnswerItem Id="a guid">3</AnswerItem>
   <AnswerItem Id="a guid">2</AnswerItem>
   <AnswerItem Id="a guid">5</AnswerItem>
  </AnswerItems>
 </Question>
</Questions>

質問クラスは次のようになります。

[Serializable()]
public class Question
{
    [XmlAttribute("Id")]
    public Guid QuestionId { get; set; }

    [XmlArray("AnswerItems")]
    [XmlArrayItem("AnswerItem", typeof(AnswerItem))]
    public AnswerItem[] AnswerItems { get; set; }
}

[Serializable()]
public class AnswerItem
{
    [XmlAttribute("Id")]
    public Guid QuestionId { get; set; }

    // how do i fetch the value of this node? 
    // its not a XmlElement and it's not an XmlValue
}

では、AnswerItemノードの値を取得します。これも取得したいものです。 AnswerItemクラスを簡単に使用できず、String型のXmlArray AnswerItemsを使用して値を配列に入れるだけで、AnswerItemのId属性が失われます。

28
Sander

AnswerItemで、Valueというプロパティを作成し、XmlText属性でマークします。この設定により、XmlSerializerAnswerItem要素のテキストをValueプロパティに読み取ります。

[Serializable()]
public class AnswerItem
{
    [XmlAttribute("Id")]
    public Guid QuestionId { get; set; }

    [XmlText]
    public string Value { get; set; }
}
63
rsbarro