Как десериализовать узел XML со значением и атрибутом, используя сериализацию asp.net - PullRequest
25 голосов
/ 29 мая 2011

У меня есть 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, а просто использовать XIlArray AnswerItems типа String и поместить значения в массив, но тогда я бы потерял атрибут Id AnswerItem.

1 Ответ

63 голосов
/ 29 мая 2011

В AnswerItem создайте свойство с именем Value и пометьте его атрибутом XmlText.Этот параметр заставит XmlSerializer прочитать текст в элементе AnswerItem в свойство Value.

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

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