C# Asp.net XML到对象

C# Asp.net XML到对象,c#,asp.net,C#,Asp.net,我有一个XML文件,其结构如下 <items> <item> <someDetail> A value here </someDetail> </item> <item> <someDetail> Another value here </someDetail> </item> </items> 这

我有一个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 reader类,以及使用
XElement
类循环xml,然后创建新的someObject(道具)


这些可能是最好和/或唯一的方法,但由于使用entities框架的数据库源非常容易,我想知道是否有类似的方法可以从xml源执行同样的操作。

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

最新的序列化技术使用和


您可以使用
DataMember
DataItem
属性装饰上面提到的类,并使用序列化程序进行反序列化。

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

最新的序列化技术使用和


您可以使用
DataMember
DataItem
属性装饰上面提到的类,并使用序列化程序进行反序列化。

我将直接使用.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

我将直接使用.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这样的简单场景中出现)

Xml序列化非常容易使用。对于您的示例,您只需要创建一个类来包含一个items,并为实际的items创建另一个类。您可能需要应用一些属性才能使一切正常工作,但编码不会太多。那就很容易了-

var serializer = new XmlSerializer(typeof(ItemsContainer));
var items = serializer.Deserialize(...) as ItemsContainer;
数据集有时被认为是“昨天的技术”,但我在它们很好地解决问题时使用它们,您可以利用设计器。生成的代码并不漂亮,但底线是您可以通过自动生成的适配器持久化到数据库,并使用数据集上的方法持久化到XML。你也可以这样读

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


VisualStudio2010(可能还有其他版本)有一个XML菜单,当您打开一个XML文件时会显示该菜单,您还可以从示例XML生成XSD。因此,在几个步骤中,您可以使用示例xml生成XSD,然后通过XSD.exe运行它,并使用生成的类和几行XmlSerializer代码。。。这感觉像是很多诡计,但你已经习惯了。

我的结论是,不存在简单的统一机制(可能是由于非平凡案例所涉及的内在复杂性——这个问题总是在简单场景(如示例xml)的上下文中出现)

Xml序列化非常容易使用。对于您的示例,您只需要创建一个类来包含一个items,并为实际的items创建另一个类。您可能需要应用一些属性才能使一切正常工作,但编码不会太多。那就很容易了-

var serializer = new XmlSerializer(typeof(ItemsContainer));
var items = serializer.Deserialize(...) as ItemsContainer;
数据集有时被认为是“昨天的技术”,但我在它们很好地解决问题时使用它们,您可以利用设计器。生成的代码并不漂亮,但底线是您可以通过自动生成的适配器持久化到数据库,并使用数据集上的方法持久化到XML。你也可以这样读

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


VisualStudio2010(可能还有其他版本)有一个XML菜单,当您打开一个XML文件时会显示该菜单,您还可以从示例XML生成XSD。因此,在几个步骤中,您可以使用示例xml生成XSD,然后通过XSD.exe运行它,并使用生成的类和几行XmlSerializer代码。。。这感觉像是很多诡计,但你已经习惯了。

“我已经尝试了几种方法”——比如?你能列举一下它们并解释为什么它们是不可行的吗?我不想建议你已经拒绝的东西。已经有一些关于这个的好帖子了。您可以查看:您好,上面的链接是我看到的使用xsd工具的两篇文章之一。只是想知道外面有没有更好的。这更多的是一个最佳实践/最佳解决方案问题,而不是一个简单的“如何”问题,“我已经尝试了几种方法”-例如?你能列举一下它们并解释为什么它们是不可行的吗?我不想建议你已经拒绝的东西。已经有一些关于这个的好帖子了。您可以查看:您好,上面的链接是我看到的使用xsd工具的两篇文章之一。只是想知道外面有没有更好的。这更多的是一个最佳实践/最佳解决方案问题,而不是一个简单的“如何操作”
XmlSerializer
很旧,新的
DataContractSerializer
给了您更多的控制权。我习惯了
XmlSerializer
,它工作正常-我还没有找到(还没有找到?)一个很好的理由是当您需要几种不同的序列化格式时—XML和JSO