我正在尝试使用 XDocument 作为基础将对象列表序列化为 XML。这样做的目的是在 WCF 服务中记录请求数据。
我的问题是如何获取对象的可变列表并将它们转换为 XDocument?我能找到的所有示例都是如何对单个对象执行此操作,而不是对不同复杂类型的多个对象执行此操作。
我想要的输出是这样的:
<rootElementName>
<CustomObjectType1>
<SubData1>Test</SubData1>
<SubData2>2014-12-22T16:33:00</SubData2>
</CustomObjectType1>
<CustomObjectType2>
<SubData3>123456</SubDataType2>
</CustomObjectType2>
</rootElementName>
最初我是从其他 Stackoverflow 示例中拼凑出来的,但我想改用 XDocument。
private static XmlDocument CreateXmlFromObjects(string rootElementName, params object[] inputs)
{
var doc = new XmlDocument();
var root = doc.AppendChild(doc.CreateElement(rootElementName));
doc.DocumentElement.SetAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
doc.DocumentElement.SetAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema");
foreach(var input in inputs)
{
SerializeAppend(doc, input);
}
return doc;
}
private static void SerializeAppend(XmlNode parentNode, object obj)
{
XPathNavigator nav = parentNode.CreateNavigator();
using (var writer = nav.AppendChild())
{
var serializer = new XmlSerializer(obj.GetType());
writer.WriteWhitespace("");
serializer.Serialize(writer, obj);
writer.Close();
}
}
我尝试使用 here 和 here 中的代码示例,但出现错误。
我试过了
private static XDocument CreateXmlFromObjects(string rootElementName, params object[] inputs)
{
var doc = new XDocument();
doc.Add(new XElement(rootElementName, inputs.Select(x => SerializeAppend2(x))));
return doc;
}
private static XDocument SerializeAppend2(object obj)
{
var document = new XDocument();
using (var writer = document.CreateWriter())
{
var serializer = new XmlSerializer(obj.GetType());
serializer.Serialize(writer, obj);
}
return document;
}
最佳答案
看起来您的尝试已经差不多了,下面应该会生成您想要的输出。基本上,不同之处在于每个子对象不需要多个 XmlWriter
和 XDocument
,您只需要一个。
private static XDocument CreateXmlFromObjects(string rootElementName, params object[] inputs)
{
var doc = new XDocument();
using (XmlWriter writer = doc.CreateWriter())
{
writer.WriteStartElement(rootElementName);
foreach (var input in inputs)
new XmlSerializer(input.GetType()).Serialize(writer, input);
writer.WriteEndElement();
}
return doc;
}
关于c# - 使用 XDocument 将多个不同类型的对象序列化为单个 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27627903/