[英]Serialize multiple objects of different types into single XML using XDocument
我試圖使用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();
}
}
我試過這個
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.