Я использую XmlSerializer
. Мой класс:
[Serializable]
[XmlRoot(ElementName="MyClass")]
public class MyClass
{
public string Value;
}
Я хотел бы сериализовать его так, чтобы Value
заканчивалось как атрибут подэлемента с именем (например) «Текст».
Желаемый результат:
<MyClass>
<Text Value="3"/>
</MyClass>
Но НЕ (что будет результатом маркировки Value как XmlAttribute
)
<MyClass Value="3">
</MyClass>
И НЕ (что будет быть результатом маркировки Value как XmlElement
):
<MyClass>
<Value>3</Value>
</MyClass>
Как мне этого добиться?
Я знаю, что могу изменить тип Value
со строки на другой сериализуемый настраиваемый класс.
К сожалению, у меня много таких свойств, поэтому мне нужно было создать десятки крошечных классов.
Есть ли более быстрое решение?
РЕДАКТИРОВАТЬ:
В ответ на ваши комментарии:
Нет, не каждое свойство нужно сериализовать в подэлемент с именем «Текст». Название «Субэлемент» уникально и однозначно.
Пример выходного XML:
<компаратор visible = "no" />
бла-бла-бла
<видимость>
Пример класса:
!
[XmlRoot(ElementName="Visibility")]
public class Visibility
{
[XPath("/site@visible")] // if only this was possible!
public string OnSite
{
get { return SiteVisible ? "yes" : "no"; }
}
[XPath("/comparator@visible")] // as above...
public string InComparator
{
get { return ComparatorVisible ? "yes" : "no"; }
}
[XmlIgnore]
public bool SiteVisible;
[XmlIgnore]
public bool ComparatorVisible;
[XPath("/expiration@days")] // as above...
public int ExpiresAfterDays;
[XmlElement("comment")] // this is easy
public string Comment;
}