Как установить значение XML сериализованного класса с помощью аннотации XmlElement

#c# #xml #serialization

#c# #xml #сериализация

Вопрос:

У меня есть класс, написанный следующим образом:

 [XmlRoot]
public class MyXMLElement
{
    [XmlAttribute]
    public string AnAttribute { get; set; }

    [XmlAttribute]
    public string AnotherElementAttribute { get; set; }
}
  

Когда это сериализуется, я хочу установить его значение, поэтому я получаю что-то вроде следующего:

 <MyXMLElement AnAttribute="something" AnotherElementAttribute="something else">The inner value of the element</MyXMLElement>
  

У кого-нибудь есть идеи?

Ответ №1:

Если вы хотите установить значение элемента, вы можете использовать [XmlText] атрибут:

 [XmlRoot]
public class MyXMLElement
{
    [XmlAttribute]
    public string AnAttribute { get; set; }

    [XmlAttribute]
    public string AnotherElementAttribute { get; set; }

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

Ответ №2:

Добавьте другое свойство для хранения внутреннего текста и пометьте его атрибутом XmlTextAttribute

 [XmlRoot]
public class MyXMLElement
{
    [XmlAttribute]
    public string AnAttribute { get; set; }

    [XmlAttribute]
    public string AnotherElementAttribute { get; set; }

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

Комментарии:

1. Упс, думаю, я должен обновить перед публикацией. =T

Ответ №3:

Вы можете сделать это довольно легко, если напишете свой собственный сериализатор (пример ниже). Это также даст вам полный контроль над тем, как сохраняется ваш объект, а не полагаться на то, как .NET решит это сделать.

 interface IXmlConvertable{
    XElement ToXml();
  

}

 public class MyClass : IXmlConvertable{

    public string Name { get; set; }

    public string ID { get; set; }

    public XElement ToXml(){

        var retval = new XElement("MyClass"
            , new XAttribute("Name", new XCData(Name))
            , new XAttribute("ID", new XCData(ID))
            );

        return retval;
    }
}