在C#中将XML反序列化为对象

所以我有这样的xml:

<todo-list> <id type="integer">#{id}</id> <name>#{name}</name> <description>#{description}</description> <project-id type="integer">#{project_id}</project-id> <milestone-id type="integer">#{milestone_id}</milestone-id> <position type="integer">#{position}</position> <!-- if user can see private lists --> <private type="boolean">#{private}</private> <!-- if the account supports time tracking --> <tracked type="boolean">#{tracked}</tracked> <!-- if todo-items are included in the response --> <todo-items type="array"> <todo-item> ... </todo-item> <todo-item> ... </todo-item> ... </todo-items> </todo-list> 

我将如何去使用.NET的序列化库反序列化成C#对象?

目前我正在使用reflection,并使用命名约定映射XML和我的对象之间。

为每个元素创build一个类,每个元素都有一个属性,每个子元素都有一个List或Array对象(使用创build的对象)。 然后调用System.Xml.Serialization.XmlSerializer.Deserialize对string并将结果作为对象进行转换。 使用System.Xml.Serialization属性进行调整,就像将元素映射到ToDoList类一样,使用XmlElement(“todo-list”)属性。

shourtcut是将您的XML加载到Visual Studio中,单击“Infer Schema”button并运行“xsd.exe / c schema.xsd”来生成类。 xsd.exe位于工具文件夹中。 然后检查生成的代码并进行调整,例如在适当情况下将shorts更改为ints。

归结为从VS中的工具使用xsd.exe:

 xsd.exe "%xsdFile%" /c /out:"%outDirectory%" /l:"%language%" 

然后用读取器和解串器加载它:

 public GeneratedClassFromXSD GetObjectFromXML() { var settings = new XmlReaderSettings(); var obj = new GeneratedClassFromXSD(); var reader = XmlReader.Create(urlToService, settings); var serializer = new System.Xml.Serialization.XmlSerializer(typeof(GeneratedClassFromXSD)); obj = (GeneratedClassFromXSD)serializer.Deserialize(reader); reader.Close(); return obj; } 

反序列化任何对象,只要typesT被标记为Serializable:

 function T Deserialize<T>(string serializedResults) { var serializer = new XmlSerializer(typeof(T)); using (var stringReader = new StringReader(serializedResults)) return (T)serializer.Deserialize(stringReader); } 

那么,你必须在你的程序集中有类似的XML(私有属性,名为ToDo的集合属性等)。

问题在于, XML中的元素对于类名是无效的 。 所以你必须在这些类中实现IXmlSerializable来控制它们如何序列化到XML。 你也许可以使用一些xml序列化的特定属性,但这取决于你的xml的模式。

这是使用reflection的一个步骤,但它可能不是你所希望的。

结帐http://xsd2code.codeplex.com/

Xsd2Code是XSD架构中的CSharp或Visual Basic业务实体类生成器。

有几个不同的选项。

  • Visual Studio包含一个名为xsd.exe的命令行程序。 您可以使用该程序来创build架构文档,然后在架构文档上再次使用该程序来创build可以与system.xml.serialization.xmlserializer使用的类
  • 你可能只能调用Dataset.ReadXml()。

你应该看看http://www.canerten.com/xml-c-class-generator-for-c-using-xsd-for-deserialization/

有一个(微软)工具可以帮助创build所需的XSD,将XML正确地反序列化为对象

几年前,我也遇到了同样的问题,那就是如何将xml映射到C#类或创build映射到我们的XML的C#类,像entity framework(我们将表映射到C#类)那样。 我最终创build了一个框架,它可以从你的XML中创buildC#类,这些类可以用来读/写你的XML。 看一下