Я пытаюсь использовать XmlAttributeOverrides для управления свойствами класса, появляющимися в xml после того, как класс был сериализован. Он работает с свойствами, которые находятся в «корневом» классе, но не на вложенных свойствах. Вот простой пример, иллюстрирующий то, что я пытаюсь выполнить.Использование XmlAttributeOverrides для вложенных свойств
Мой класс иерархия выглядит следующим образом:
public class Main
{
public string Name { get; set; }
public Location Address { get; set; }
}
public class Location
{
public string StreetAddress { get; set; }
public Contact ContactInfo{ get; set; }
}
public class Contact
{
public string PhoneNumber { get; set; }
public string EmailAddr { get; set; }
}
Когда я сериализации Main(), я получаю что-то вроде этого:
<Main>
<Name></Name>
<Address>
<StreetAddress></StreetAddress>
<ContactInfo>
<PhoneNumber></PhoneNumber>
<EmailAddr></EmailAddr>
</ContactInfo>
</Address>
</Main>
Что я могу сделать, это держать Имя или адрес появляться при использовании этого:
XmlAttributeOverrides overrides = new XmlAttributeOverrides();
XmlAttributes attribs = new XmlAttributes();
attribs.XmlIgnore = true;
attribs.XmlElements.Add(new XmlElementAttribute("Address"));
overrides.Add(typeof(Main), "Address", attribs);
xs = new XmlSerializer(typeof(Main), overrides);
Что мне нужно, чтобы быть в состоянии сделать, это держать Main.Address.ContactInf o от сериализации ИНОГДА (если он пуст). Я попытался следующие, но они не работали:
XmlAttributeOverrides overrides = new XmlAttributeOverrides();
XmlAttributes attribs = new XmlAttributes();
attribs.XmlIgnore = true;
attribs.XmlElements.Add(new XmlElementAttribute("ContactInfo "));
overrides.Add(typeof(Contact), "ContactInfo ", attribs);
xs = new XmlSerializer(typeof(Contact), overrides);
и ...
XmlAttributeOverrides overrides = new XmlAttributeOverrides();
XmlAttributes attribs = new XmlAttributes();
attribs.XmlIgnore = true;
attribs.XmlElements.Add(new XmlElementAttribute("ContactInfo "));
overrides.Add(typeof(Main.Address.ContactInfo), "ContactInfo ", attribs);
xs = new XmlSerializer(typeof(Main.Address.ContactInfo), overrides);
Я на самом деле пытался многое другое, в том числе используя операторы XPath назначить имя атрибута целевому но не хотел заполнять эту страницу неудачными попытками. Является ли то, что я прошу даже по этому методу?
Это замечательно! Большое вам спасибо за усилия, которые вы вложили в этот ответ! – user1437872
@ user1437872: Я рад, что вы нашли этот ответ полезным. Не могли бы вы отметить этот ответ как ответ, если это решило ваш вопрос? Отметив этот вопрос как ответ, он увеличивает мою репутацию на сайте. Это помогает другим знать, как хорошая (или не) информация может быть на сайте. Еще раз спасибо за положительный комментарий! – fourpastmidnight
Спасибо за ответ! – fourpastmidnight