Asp.net XML to objects

本文关键字:objects to XML net Asp | 更新日期: 2023-09-27 18:30:42

我有一个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阅读器类以及usin类XElement遍历xml,然后创建新的someObject(props)。

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

Asp.net XML to objects

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

最新的序列化技术使用数据协定和DataContractSerializer

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

我会直接使用 .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);
  }

我得出的结论是没有简单的统一机制(可能是由于非平凡情况所涉及的固有复杂性 - 这个问题总是在简单场景的上下文中出现,例如您的示例 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 代码...感觉就像很多阴谋诡计,但你已经习惯了。