代码之家  ›  专栏  ›  技术社区  ›  Justin Bozonier

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

  •  53
  • Justin Bozonier  · 技术社区  · 16 年前

    所以我有这样的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和对象之间进行映射。

    8 回复  |  直到 16 年前
        1
  •  59
  •   Dan Goldstein    16 年前

    为每个元素创建一个类,每个元素有一个属性,每个子元素有一个对象列表或数组(使用创建的)。然后对字符串调用System.xml.Serialization.XmlSerializer.Deserialize,并将结果转换为对象。使用system.xml.serialization属性进行调整,例如将元素映射到todo list类,使用xmlement(“todo list”)属性。

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

        2
  •  34
  •   Community CDub    8 年前

    归根结底,使用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;
    }
    
        3
  •  15
  •   Keith    10 年前

    反序列化任何对象,只要类型 T 标记为可序列化:

    function T Deserialize<T>(string serializedResults)
    {
        var serializer = new XmlSerializer(typeof(T));
        using (var stringReader = new StringReader(serializedResults))
            return (T)serializer.Deserialize(stringReader);
    }
    
        4
  •  4
  •   Will    16 年前

    好吧,您的程序集中必须有与XML(名为private的属性、名为todo的集合属性等)大致匹配的类。

    问题是 XML中的元素对类名无效 .因此,您必须在这些类中实现IXML可序列化,以控制如何将它们序列化到XML和从XML序列化。您也可以使用一些特定于XML序列化的属性,但这取决于您的XML模式。

    这比使用反射要高出一步,但这可能不是你所希望的。

        5
  •  4
  •   Deepfreezed    15 年前

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

    XSD2code是XSD架构中的CSharp或VisualBasic业务实体类生成器。

        6
  •  3
  •   Joel Coehoorn    16 年前

    有几个不同的选择。

    • Visual Studio包含一个名为xsd.exe的命令行程序。您可以使用该程序创建架构文档,并在架构文档上再次使用该程序来创建可用于的类。 system.xml.serialization.xmlserializer
    • 您可能只能对它调用dataset.readxml()。
        7
  •  3
  •   Luk    16 年前

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

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

        8
  •  -1
  •   Savaratkar    12 年前

    几年前,我也遇到过同样的问题:ABT如何将XML映射到C类,或者创建映射到XML的C类,JST,就像我们在实体框架中所做的那样(我们将表映射到C类)。我最后创建了一个框架,它可以从XML中创建C类,这些类可以用来读/写XML。有一个 look

    推荐文章