如何重新序列化修改后的对象并插回到XDocument?

时间:2012-01-19 23:43:45

标签: c# .net xml-serialization linq-to-xml

我有一组在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文档。 ---&GT; 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 >

有什么想法吗?

我知道我可以添加一个元素“制造商”,如果没有找到,然后分配值,但这似乎很容易被打破。

0 个答案:

没有答案