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源。
反序列化 XML 的最佳方法是创建一个与 XML 结构相对应的类,XML 数据将反序列化为该结构。
最新的序列化技术使用数据协定和DataContractSerializer
。
你用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
然后读取 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 代码...感觉就像很多阴谋诡计,但你已经习惯了。