繁体   English   中英

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

[英]Deserializing XML to Objects in C#

所以我有一个看起来像这样的 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# 对象?

目前我正在使用反射,并使用命名约定在 xml 和我的对象之间进行映射。

为每个元素创建一个类,每个元素具有每个元素的属性,并为每个子元素创建一个List或Array对象(使用创建的对象)。 然后对字符串调用System.Xml.Serialization.XmlSerializer.Deserialize并将结果转换为对象。 使用System.Xml.Serialization属性进行调整,例如将元素映射到ToDoList类,使用XmlElement(“todo-list”)属性。

shourtcut是将XML加载到Visual Studio中,单击“推断模式”按钮并运行“xsd.exe / c schema.xsd”以生成类。 xsd.exe位于tools文件夹中。 然后浏览生成的代码并进行调整,例如在适当的地方将短路更改为整数。

归结为使用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;
}

反序列化任何对象,只要类型T标记为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的类(称为Private的属性,称为ToDo的集合属性等)。

问题是XML具有对类名无效的元素 因此,您必须在这些类中实现IXmlSerializable,以控制它们与XML的序列化方式。 您也可以使用某些xml序列化特定属性,但这取决于您的xml架构。

这是使用反射的一步,但它可能不是你所希望的。

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

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

有几种不同的选择。

  • Visual Studio包含一个名为xsd.exe的命令行程序。 您使用该程序创建模式文档,并在模式文档上再次使用该程序来创建可与system.xml.serialization.xmlserializer使用的类
  • 您可能只能在其上调用Dataset.ReadXml()。

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

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

几年前我有同样的问题,如何将xml映射到C#类或创建映射到我们的XML的C#类,就像我们在实体框架中那样(我们将表映射到C#类)。 我最终创建了一个框架,它可以用你的XML创建C#类,这些类可以用来读/写你的xml。 看看

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM