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

ake*_*van 3 c# xml schema xsd datagridview

我有一个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";
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*eld 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);
Run Code Online (Sandbox Code Playgroud)

对于XmlReadMode,您有几个选项.它们决定了如果您的数据与您的架构不匹配会发生什么,以及如果XML文件中的内联架构与您已加载的架构不同,该怎么办:

  • XmlReadMode.ReadSchema将导入任何内联架构,只要它不与已加载的架构冲突; 如果有名称冲突,ReadXml则会抛出; 要么
  • XmlReadMode.IgnoreSchema将忽略任何内联架构,并尝试强制数据到您指定的架构.在这种模式下,不符合你的架构的数据将不会在数据集中结束.
  • XmlReadMode.InferSchema将忽略任何内联架构,但在这种情况下,任何不符合您的架构的数据都将导致您的架构被扩展; 例如,如果您的XML文件具有不在架构中的表,则该表将添加到架构中并导入数据.如果不同类型的列之间存在名称冲突,ReadXml则会抛出;

如果你是第ReadXml一个,你总是得到ReadSchema模式,如果有内联架构,或InferSchema模式,如果没有.即使这是你想要的,最好明确它.