【问题标题】:How do I map XML to C# objects如何将 XML 映射到 C# 对象
【发布时间】:2010-09-10 09:34:35
【问题描述】:

我有一个想要加载到对象的 XML,操作这些对象(设置值、读取值),然后将这些 XML 保存回来。 在我创建的结构 (xsd) 中包含 XML 对我来说很重要。

一种方法是编写我自己的序列化程序,但是是否有对它的内置支持或我可以使用的 C# 中的开源代码?

【问题讨论】:

    标签: c# xml serialization xml-serialization


    【解决方案1】:

    您可以使用 xsd.exe 从架构 (xsd) 生成可序列化的 C# 类:

    xsd.exe dependency1.xsd dependency2.xsd schema.xsd /out:outputDir
    

    如果架构具有依赖项(包含/导入的架构),则它们必须全部包含在同一命令行中。

    【讨论】:

    • [+1] 值得注意的是,在使用 XSD 时,您还应该使用 /c 来生成类或 /d 来生成 DataSet 派生类。否则,您将收到以下错误消息“错误:只能生成类或数据集之一。”。
    【解决方案2】:

    此代码(C# DotNet 1.0 及更高版本)可以很好地将大多数对象序列化为 XML。 (然后回来) 它不适用于包含 ArrayLists 的对象,如果可能,请坚持仅使用 Arrays

    using System;    
    using System.IO;
    using System.Text;
    using System.Xml.Serialization;
    using System.Runtime.Serialization;
    using System.Runtime.Serialization.Formatters.Binary;
    
    
    public static string Serialize(object objectToSerialize)
    {
        MemoryStream mem = new MemoryStream();          
        XmlSerializer ser = new XmlSerializer(objectToSerialize.GetType());         
        ser.Serialize(mem, objectToSerialize);                      
        ASCIIEncoding ascii = new ASCIIEncoding();
        return ascii.GetString(mem.ToArray());
    }        
    
    public static object Deserialize(Type typeToDeserialize, string xmlString)
    {
        byte[] bytes = Encoding.UTF8.GetBytes(xmlString);
        MemoryStream mem = new MemoryStream(bytes);         
        XmlSerializer ser = new XmlSerializer(typeToDeserialize);
        return ser.Deserialize(mem);
    }
    

    【讨论】:

    • 方便的例程,但请注意,它不适用于没有无参数构造函数的对象。
    • 我们是否需要在 TypeToDeserialize 类及其成员上编写任何类型的映射标签???
    • 这帮助我们在保存到数据库的 JSON.NET JSON 和 XML 之间进行转换。 JSON.NET 没有创建可以使用自身重新映射回 JSON 的 XML,也就是说,我们从来没有想出一种方法来使用它生成的 XML 和 ASP.NET 的 XML 方法。
    【解决方案3】:

    LINQ to XML 如果您使用.net 3.5 非常强大,LINQ to XSD 可能对您也有用!

    【讨论】:

    • 它真的会按照问题中的说明映射到 c# 吗?
    • 不,Linq To XML 不能用于映射到持久类。
    【解决方案4】:

    使用 Visual Studio 附带的 xsd.exe 命令行程序来创建可以在项目/解决方案中使用的类文件,并使用 System.Xml.Serialization 命名空间(特别是 XmlSerializer 类)来序列化/反序列化这些类往返磁盘。

    【讨论】:

      【解决方案5】:

      使用 System.Xml.Serialization; 如果要将 xml 映射到任何随机对象,此命名空间具有您需要的所有属性。或者,您可以使用 xsd.exe 工具

      xsd 文件.xsd {/类 | /数据集} [/元素:元素] [/语言:语言] [/命名空间:命名空间] [/outputdir:directory] ​​[URI:uri] 这将获取您的 xsd 文件并从中创建 c# 或 vb.net 类。

      http://msdn.microsoft.com/en-us/library/x6c1kb0s(VS.71).aspx

      【讨论】:

        【解决方案6】:

        我同意 xsd 真的很垃圾......但是他们制作了另一个几乎没有人知道的版本。它称为 xsd 对象生成器。它是下一个版本,并且有更多选择。它从 XSD 生成文件并且效果很好。如果你有像 XML spy 这样的模式生成器;从您的 xml 创建一个 xsd 并使用此工具。我使用这个工具创建了非常非常复杂的类。 然后为额外的属性\方法等创建部分类,然后当您更新架构时,您只需重新生成您的类,并且任何编辑都会保留在您的部分类中。

        http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=7075

        【讨论】:

          【解决方案7】:

          来自 Microsoft 的 xsd.exe 有很多错误 :| 试试这个开源明珠http://xsd2code.codeplex.com/

          【讨论】:

          • +1 谢谢。它实际上是一个活跃的项目并且有一些文档。
          【解决方案8】:

          我们创建了一个框架,可以从您的 XML 中自动生成 C# 类。它是一个可视项目模板,您可以将 XML 传递给该模板,并且这些类会在您的项目中自动生成。使用这些类,您可以创建/读取/写入您的 XML。

          查看此链接以获取框架和 Visual C# 项模板:click here

          【讨论】:

            【解决方案9】:

            我敢打赌 NetDataContractSerializer 可以做你想做的事。

            【讨论】:

              猜你喜欢
              • 2021-04-13
              • 2012-03-09
              • 1970-01-01
              • 2012-04-11
              • 2012-04-16
              • 2015-08-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多