我有一个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";
我确信有更好的方法可以解决这个问题......我可以把它作为装配的一部分包括在内吗?谢谢你的帮助。
答案 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
模式。即使这是你想要的,最好明确它。