【问题标题】:Serialize multiple objects of different types into single XML using XDocument使用 XDocument 将多个不同类型的对象序列化为单个 XML
【发布时间】:2015-02-22 00:58:33
【问题描述】:

我正在尝试使用 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();
    }
}

我尝试使用来自herehere 的代码示例,但出现错误。

我试过了

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;
}

【问题讨论】:

    标签: c# xml xml-serialization linq-to-xml


    【解决方案1】:

    您的尝试似乎快到了,下面应该会生成您想要的输出。基本上区别在于每个子对象不需要有很多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;
    }
    

    【讨论】:

    • 如果它不明显,您需要在继续对文档执行任何其他操作(如保存)之前处理编写器(就像这里使用 using 语句所做的那样)。这让我有点抓狂
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    相关资源
    最近更新 更多