将xml模式和数据加载到DataSet(和datagridview)

本文关键字:DataSet datagridview 加载 xml 模式 数据 | 更新日期: 2023-09-27 18:11:41

我有一个datagridview,其中填充了来自.xml文件的数据。数据是MyObject的列表,其中MyObject是我拥有的c#类。这最初是在没有模式的情况下完成的,所以没有类型信息:(意味着我没有得到MyObject类中为bool等自动生成的复选框列的好处。

所以我使用xsd.exe生成一个。xsd文件。看起来太棒了!但是如何将这个。xsd部署到应用程序中呢?我是否需要确保它位于与我的应用程序相同的目录中并像这样加载它:

DataSet ds = new DataSet();
ds.ReadXml("mystuff.xml");
ds.ReadXmlSchema("myschema.xsd");
dataGridView_1.DataSource = ds;
dataGridView_1.DataMember = "MyObject";

我相信有更好的方法来处理这个…我能把它作为会议的一部分吗?谢谢你的帮助。

将xml模式和数据加载到DataSet(和datagridview)

使其成为内嵌的强类型资源。

将文件添加到您的项目中,并给它一个"Content"answers"Do Not Copy"的Build Action。然后打开Resources designer选项卡(从Properties文件夹或Project Properties对话框中)并将文件拖到Resource designer画布上。该文件现在已嵌入到程序集中。这将生成默认Resources类的强类型属性,其名称与它来自的文件名称相同。

要将其加载到数据集中,可以将StringReader连接到它。注意,您几乎总是希望首先加载模式,因为它改变了ReadXml的行为:

var ds = new DataSet();
using (var rdr = new StringReader(Properties.Resources.myschema))
{
    ds.ReadXmlSchema(rdr);
}
ds.ReadXml("mystuff.xml", XmlReadMode.IgnoreSchema);

对于XmlReadMode,您有几个选项。它们规定了数据与模式不匹配时的处理方法,以及XML文件中内联定义的模式与已加载的模式不同时的处理方法:

  • XmlReadMode.ReadSchema将导入任何内联模式,只要它不与已加载的模式发生冲突;如果存在名称冲突,ReadXml将抛出;或
  • XmlReadMode.IgnoreSchema将忽略任何内联模式,并尝试将数据强制到您指定的模式。在此模式下,与模式不匹配的数据将而不是最终进入数据集。
  • XmlReadMode.InferSchema将忽略任何内联模式,但在这种情况下,任何不符合您的模式的数据将导致您的模式被扩展;例如,如果XML文件中有一个表不在您的模式中,那么该表将被添加到您的模式中并导入数据。如果不同类型的列之间存在名称冲突,ReadXml将抛出;

如果你先执行ReadXml,如果有内联模式,你总是得到ReadSchema模式,或者如果没有InferSchema模式。即使这是你想要的,也要明确。