2011-10-18 57 views
3

我有一个datagridview填充了来自.xml文件的数据。数据是MyObjects的列表,其中MyObject是我拥有的C#类。这最初是没有模式,所以没有类型的信息:(意味着我没有得到自动生成的复选框列的bools等MyObject类的好处将XML模式和数据加载到数据集(和datagridview)

所以我用xsd.exe来生成。.xsd文件看起来不错,但我怎么部署此的.xsd与应用我必须确保它坐落在同一个目录中我的应用程序并加载它喜欢!?

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

我肯定有更好的方法来处理这个...我可以将它作为程序集的一部分或其他东西吗?谢谢你的帮助。

回答

5

使它成为一个嵌入式的强类型资源

将文件添加到您的项目并为其提供“内容”和“不要复制”的构建操作。然后打开资源设计器选项卡(从属性文件夹或项目属性对话框中)并将文件拖到资源设计器画布上。该文件现在嵌入到您的程序集中。这将产生默认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模式如果不存在。即使这是你想要的,最好清楚一点。

+0

哇。杀死它。很简单。谢谢!! – akevan

+0

我发现即使在readxml()之前调用readschema(),XmlReadMode.IgnoreSchema也不会工作。这个出现是使用我自己的或上面的代码的情况。 xml文件中但未在模式文件中列出的任何元素都会以静默方式添加到数据集中。 – Canacourse