0

我有一个 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 源。

4

3 回答 3

2

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

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

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

于 2012-04-11T18:22:50.687 回答
1

I'd use directly the .NET XML serialization - classes declarations:

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

and then to read the XML:

  using (FileStream fs = new FileStream(@"c:\temp\items.xml", FileMode.Open, FileAccess.Read)) {
    MyData myData = MyData.Deserialize(fs);
  }
于 2012-04-11T18:24:14.313 回答
1

我得出的结论是没有简单的统一机制(可能是由于涉及非平凡案例的固有复杂性 - 这个问题总是在您的示例 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 代码......感觉就像很多阴谋但你习惯了给它。

于 2012-04-11T18:35:44.197 回答