Как повторно сериализовать измененный объект и вставить обратно в XDocument? - PullRequest
1 голос
/ 20 января 2012

У меня есть вложенный набор объектов, представленных в 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 >

Есть идеи?

Я знаю, что мог бы добавить элемент «Производитель», если он не найден, и затем присвоить значение, но, похоже, он может легко сломаться.

...