У меня есть вложенный набор объектов, представленных в XDocument следующим образом:
<Record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="FooInfo">
<Name>Red</Name>
<Record xsi:type="BarInfo">
<Name>Tomato</Name>
<Record xsi:type="BazInfo">
<Name>Juice</Name>
</Record >
<Record xsi:type="BazInfo">
<Name>Sauce</Name>
</Record >
</Record >
</Record >
Я запрашиваю _doc.Descendents()
и десериализую в объект BazInfo
:
var info = doc.Descendants().Where(d => d.Attributes(xn).FirstOrDefault() != null)
.Where(d => d.Attribute(xn).Value == "BazInfo")
.Where(d => d.Element(name).Value == "Sauce");
int count = info .Count();
var e = info.First();
BazInfo bi = (BazInfo)s.Deserialize(e.CreateReader());
Класс BazInfo выглядит следующим образом:
class BazInfo : IInfo {
[XmlElement]
string Name { get; set; }
[XmlElement]
string Manufacturer { get; set; }
}
При первоначальной сериализации BazInfo
свойство Manufacturer
не было включено, т. Е. Элемент <Manufacturer />
отсутствует, поскольку значение не было назначено.Это не проблема, за исключением того, что когда я хочу присвоить значение, я не могу просто посмотреть этот элемент в потомках или коллекциях элементов.Итак, я десериализирую объект и присваиваю значение:
bi.Manufacturer = "Acme";
// re-serialize element
s.Serialize(e.CreateWriter(), bi);
Когда я пытаюсь повторно сериализовать объект, я получаю исключение:
System.InvalidOperationException: былоошибка при создании документа XML.---> System.InvalidOperationException: WriteStartDocument не может быть вызван на устройствах записи, созданных с помощью ConformanceLevel.Fragment.
Я хочу иметь возможность вставить объект обратно, где он принадлежит:
<Record xsi:type="BarInfo">
<Name>Tomato</Name>
<Record xsi:type="BazInfo">
<Name>Juice</Name>
</Record >
<Record xsi:type="BazInfo">
<Name>Sauce</Name>
<Manufacturer>Acme</Manufacturer>
</Record >
</Record >
Есть идеи?
Я знаю, что мог бы добавить элемент «Производитель», если он не найден, и затем присвоить значение, но, похоже, он может легко сломаться.