如何将XML映射到C#对象

29

我有一个XML文件,希望将其加载到对象中,操作这些对象(设置值、读取值),然后将这些XML文件保存回去。对我来说,将XML文件保持在我创建的结构(xsd)中非常重要。

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

9个回答

29
您可以使用xsd.exe从模式(xsd)生成可序列化的C#类:
xsd.exe dependency1.xsd dependency2.xsd schema.xsd /out:outputDir

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

12
值得注意的是,在使用XSD时,您还应该使用/c来生成类或/d来生成派生自DataSet类的DataSet类。否则,您将会收到以下错误消息:“Error: Can only generate one of classes or datasets.” - Marc

18
这段代码(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);
}

1
方便的例程,但请注意它无法在没有无参构造函数的对象上工作。 - Chad
在类TypeToDeserialize及其成员上,我们需要编写任何类型的映射标签吗? - Mubashar
这帮助我们在 JSON.NET JSON 和保存到数据库的 XML 之间进行转换。JSON.NET 没有创建可使用自身重新映射回 JSON 的 XML,即我们从未找到一种使用它生成的 XML 与 ASP.NET 的 XML 方法结合的方法。 - Zachary Scott

7

LINQ to XML 在使用 .net 3.5 时非常强大,如果您需要的话,LINQ to XSD 也可能对您有用!


它是否真的像问题所述那样映射到C#? - Konstantin
不好意思,Linq To XML 不能用于映射到持久化类。 - Genady Sergeev

2
使用随 Visual Studio 附带的 xsd.exe 命令行程序创建类文件,以便在您的项目/解决方案中使用,并使用 System.Xml.Serialization 命名空间(特别是 XmlSerializer 类)将这些类序列化/反序列化到磁盘。请注意保留 HTML 标签。

2
使用 System.Xml.Serialization 命名空间,如果您想将 XML 映射到任何随机对象,则该命名空间具有您所需的所有属性。或者,您可以使用 xsd.exe 工具。
xsd file.xsd {/classes | /dataset} [/element:element] [/language:language] [/namespace:namespace] [/outputdir:directory] [URI:uri]
该工具将获取您的 XSD 文件并创建 C# 或 VB.NET 类。

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


1

+1 谢谢。这实际上是一个正在进行并有一些文档的项目。 - knownasilya

1

我同意xsd确实很糟糕...但是他们又做了一个几乎没人知道的新版本,叫做xsd对象生成器。它是下一个版本,拥有更多的选项。它可以从XSD生成文件,非常好用。如果你有一个模式生成器像XML Spy,从你的xml创建一个xsd并使用这个工具。我已经使用这个工具创建了非常复杂的类。 然后为额外的属性/方法等创建部分类,当您更新模式时,只需重新生成类,任何编辑都会保存在您的部分类中。

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


1
我们已经创建了一个框架,可以将您的XML自动生成C#类。它是一个可视化项目模板,您只需传入您的XML,就可以在您的项目中自动生成类。使用这些类,您可以创建/读取/写入您的XML。
请访问此链接以获取该框架和Visual C#项目模板:点击这里

0

我敢打赌NetDataContractSerializer可以实现你想要的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接