我有一组在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 >
有什么想法吗?
我知道我可以添加一个元素“制造商”,如果没有找到,然后分配值,但这似乎很容易被打破。