如何将模型(从 xsd.exe 构建)序列化为 XmlDocument?

Posted

技术标签:

【中文标题】如何将模型(从 xsd.exe 构建)序列化为 XmlDocument?【英文标题】:How to serialize model (built from xsd.exe) to XmlDocument? 【发布时间】:2020-12-03 17:37:21 【问题描述】:

查看下面的代码,我想看看如何从 xsd.exe 生成的对象模型中提供 XmlDocument:

var myModelObj = new MyModel();
var xmlDoc = new XmlDocument();
string xmlStr = null;
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
System.IO.StringWriter sw = new System.IO.StringWriter();
using (var xmlWriter = XmlWriter.Create(sw))

    System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(Models.MyModel));
    serializer.Serialize(xmlWriter, myModelObj);
    xmlWriter.Flush();
    // xmlDoc = ______________ ????
    xmlStr = sw.ToString();

目的是使用 xml(XmlDocument?)为内存存储提供服务,我最终可以使用它来生成加密流或文件输出。谢谢!

更新:

这行得通吗?

xmlDoc.Load(sw.ToString());

有没有办法更直接地从 XmlSerializer 的 Serialize 方法生成 XmlDocument 输出?

【问题讨论】:

你可以使用XmlNodeExtensions.SerializeToXmlDocument()从this answer到How to create sets of the serialized objects C#。 或查看this answer 和this answer also 到How to create an XML document from a .NET object?,尽管未被接受,但它们是更好的答案,并展示了如何通过序列化直接创建XmlDocument 【参考方案1】:

通过dbc审核suggested answer,我创建了扩展:

public static class XmlExtensions

    public static XmlDocument SerializeToXmlDocument<T>(this T o)
    
        return SerializeToXmlDocument(o, new XmlSerializer(o.GetType()));
    

    public static XmlDocument SerializeToXmlDocument<T>(this T o, XmlSerializer serializer)
    
        XmlDocument doc = new XmlDocument();
        using (XmlWriter writer = doc.CreateNavigator().AppendChild())
            serializer.Serialize(writer, o);
        return doc;
    

并像这样实现:

var xmlDoc = myModelObj.SerializeToXmlDocument(
    new System.Xml.Serialization.XmlSerializer(
        typeof(Models.MyModel)
        )
    );

【讨论】:

以上是关于如何将模型(从 xsd.exe 构建)序列化为 XmlDocument?的主要内容,如果未能解决你的问题,请参考以下文章

C# XML 反序列化为一张表中的 DataSet

从使用 XSD.exe 生成的 XML 中反序列化类

如何将 XML 映射到 C# 对象

Swift 2:将 JSON 原生序列化为核心数据模型对象

XSD.exe 和“循环组引用”

将对象转换为 XML 字符串