将xml架构和数据加载到DataSet(和datagridview)中

时间:2011-10-18 18:38:38

标签: c# xml datagridview xsd schema

我有一个datagridview,其中填充了.xml文件中的数据。数据是MyObjects的列表,其中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";

我确信有更好的方法可以解决这个问题......我可以把它作为装配的一部分包括在内吗?谢谢你的帮助。

1 个答案:

答案 0 :(得分:6)

使其成为嵌入式强类型资源。

将文件添加到项目中,并为其提供“内容”的构建操作和“不复制”。然后打开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模式。即使这是你想要的,最好明确它。

相关问题