如何使用asp.net序列化使用值和属性反序列化xml节点

时间:2011-05-29 16:40:04

标签: c# xml c#-4.0 xml-serialization

我有4个小类可以将xml从一个新的xml轮询反序列化到可用的类来构建轮询。

现在,我知道如何从类中设置属性,以匹配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属性。

1 个答案:

答案 0 :(得分:62)

AnswerItem中,创建一个名为Value的属性,并使用XmlText属性对其进行标记。此设置会导致XmlSerializerAnswerItem元素中的文字读入Value属性。

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

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