【问题标题】:Asp.net XML to objectsAsp.net XML 到对象
【发布时间】:2012-04-24 02:04:23
【问题描述】:

我有一个 XML 文件,其结构类似于

<items>
  <item>
    <someDetail>
      A value here
     </someDetail>
  </item>
  <item>
    <someDetail>
      Another value here
     </someDetail>
  </item>
</items>

里面有多个项目。

我想在会话开始时反序列化 XML,以便将 XML 数据转换为基于类的对象(c# asp.net 4)

我尝试了几种方法,要么没有成功,要么解决方案显得笨拙和不优雅。

人们会提出什么建议?

我尝试过使用xsd.exe 工具,并尝试使用xml 阅读器类,以及使用XElement 类循环遍历xml 然后创建新的someObject(props)。

这些可能是最好的和/或唯一的方法,但是对于使用实体框架的数据库源来说非常容易,我想知道是否有类似的方法可以做同样的事情,但来自 xml 源。

【问题讨论】:

  • “我已经尝试了几种方法” - 例如?您能否列举它们并解释为什么它们不可行?我不想推荐你已经拒绝的东西。
  • 这方面已经有一些不错的帖子了。您可以查看:stackoverflow.com/questions/3187444/…
  • 嗨,上面的链接是我使用 xsd 工具看到的关于 SO 的 2 个帖子之一。只是想知道那里是否没有更好的东西。这更像是一个最佳实践/最佳解决方案问题,而不是简单的“如何做”

标签: c# asp.net


【解决方案1】:

反序列化 XML 的最佳方法是创建一个与 XML 数据将反序列化到的 XML 结构相对应的类。

最新的序列化技术使用Data ContractsDataContractSerializer

您使用DataMemberDataItem 属性装饰我上面提到的类,并使用序列化程序进行反序列化。

【讨论】:

    【解决方案2】:

    我会直接使用 .NET XML 序列化 - 类声明:

    public class Item {
    
      [XmlElement("someDetail")]
      public string SomeDetail;
    
    } // class Item
    
    
    [XmlRoot("items")]
    public class MyData {
    
      [XmlElement("item")]
      public List<Item> Items;
    
      public static MyData Deserialize(Stream source)
      {
        XmlSerializer serializer = new XmlSerializer(typeof(MyData));
        return serializer.Deserialize(source) as MyData;
      } // Deserialize
    
    } // class MyData
    

    然后读取 XML:

      using (FileStream fs = new FileStream(@"c:\temp\items.xml", FileMode.Open, FileAccess.Read)) {
        MyData myData = MyData.Deserialize(fs);
      }
    

    【讨论】:

    • XmlSerializer 是旧的,新的 DataContractSerializer 给你更多的控制权。
    • 我已经习惯了 XmlSerializer 并且它工作正常 - 我没有找到(还没有?)一个令人信服的理由来尝试不同的东西。
    • 一个很好的理由是当您需要几种不同的序列化格式时 - 例如 XML 和 JSON。 DataContractSerializer 很容易做到,XmlSerializer 则不然。
    • @Oded,感谢您提供的信息-否则我不知道我会如何了解它-顺便说一句,您如何将其名称与其功能联系起来(换句话说,我怎么记得这)?
    • @Oded,好的,它恰好是一个更好的通用 xml 序列化程序,这就是您的目标。我明白了。
    【解决方案3】:

    我的结论是没有简单的统一机制(可能是由于涉及非平凡案例的固有复杂性 - 这个问题总是在您的示例 xml 等简单场景的上下文中出现)。

    Xml 序列化非常容易使用。对于您的示例,您只需创建一个包含项目的类和实际项目的另一个类。您可能必须应用一些属性才能使一切正常工作,但编码不会太多。然后就很简单了-

    var serializer = new XmlSerializer(typeof(ItemsContainer));
    var items = serializer.Deserialize(...) as ItemsContainer;
    

    数据集有时被认为是“昨天的技术”,但我会在它们很好地解决问题时使用它们,并且您可以利用设计器。生成的代码并不漂亮,但底线是您可以通过自动生成的适配器将其持久化到数据库,并使用数据集上的方法将其持久化到 XML。你也可以这样读。

    一旦你习惯了 XSD.exe,它就不会那么糟糕了。我将帮助打印到一个文本文件中,并将其包含在我的解决方案中一段时间​​。当您使用 /c 选项创建类时,您将获得可与 XmlSerialzier 一起使用的干净代码。

    Visual Studio 2010(可能还有其他版本)有一个 XML 菜单,当您打开一个 Xml 文件时会出现该菜单,您还可以从该菜单中从示例 Xml 生成一个 XSD。因此,通过几个步骤,您可以获取示例 xml 并生成 XSD,然后通过 XSD.exe 运行它并使用生成的类和几行 XmlSerializer 代码......感觉就像很多阴谋但你习惯了给它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      • 2012-09-12
      • 2011-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多