c# - 使用 XDocument 将多个不同类型的对象序列化为单个 XML

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

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

最佳答案

看起来您的尝试已经差不多了,下面应该会生成您想要的输出。基本上,不同之处在于每个子对象不需要多个 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;
}

关于c# - 使用 XDocument 将多个不同类型的对象序列化为单个 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27627903/

相关文章:

c# - 将null设置为文档属性,并在更新时从数据库中删除字段

c# - 使用 Linq-to-SQL 添加多条记录

c# - 将 JSON 发布到 Web 服务 (400) 错误请求

android - 实现 HTML 书状分页

c# - 无法终止 Silverlight 中的工作线程

android - ExpandableListView 可扩展列表在其高度为 wrap_content 且下方有内容时不扩展

java - Java 中的 XML 解析器应返回已使用的已定义类的 Arraylist

c# - 如何在 C# 中序列化/反序列化可选的 XML 枚举?

c# - 如何为 DLL 而不是 EXE 选择 sgen 生成的 XmlSerializer DLL?

java - 简单框架 XML : Element with Inner Text and Child Elements