簡體   English   中英

使用XDocument將不同類型的多個對象序列化為單個XML

[英]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;
}

看起來你差點在你的嘗試,下面應該生成你想要的輸出。 基本上差異在於每個子對象都有許多XmlWriterXDocument ,而只需要一個。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM