【发布时间】:2018-07-17 11:59:05
【问题描述】:
我有一个大型 XML 文档,我想使用 XmlSerializer 类插入新元素,其内容来自使用 xsd.exe 生成的 .NET 类实例。
这是问题How to deserialize a node in a large document using XmlSerializer 的后续,并使用该问题中描述的相同xsd 和生成的类。
假设在我的示例 XML 中,我想将我的福特汽车换成宝马。我试过以下代码:
static string XmlContent = @"
<RootNode xmlns=""http://MyNamespace"">
<Cars>
<Car make=""Volkswagen"" />
<Car make=""Ford"" />
<Car make=""Opel"" />
</Cars>
</RootNode>";
private static void TestWriteMcve()
{
var doc = new XmlDocument();
doc.LoadXml(XmlContent);
var nsMgr = new XmlNamespaceManager(doc.NameTable);
nsMgr.AddNamespace("myns", "http://MyNamespace");
var node = doc.DocumentElement.SelectSingleNode("myns:Cars/myns:Car[@make='Ford']", nsMgr);
var parent = node.ParentNode;
var carSerializer = new XmlSerializer(typeof(Car));
using (var writer = node.CreateNavigator().InsertAfter())
{
// WriteWhitespace needed to avoid error "WriteStartDocument cannot
// be called on writers created with ConformanceLevel.Fragment."
writer.WriteWhitespace("");
var newCar = new Car { make = "BMW" };
carSerializer.Serialize(writer, newCar);
}
parent.RemoveChild(node);
Console.WriteLine(parent.OuterXml);
}
我得到的结果和我想要的很接近:
<Cars xmlns="http://MyNamespace">
<Car make="Volkswagen" />
<Car xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" make="BMW" xmlns="" />
<Car make="Opel" />
</Cars>
除了添加的元素上所有不需要的xmlns:... 属性。它们是从哪里来的,我该如何摆脱它们?
【问题讨论】:
标签: c# .net xml xsd xmlserializer