将XML模式和数据加载到DataSet(和DataGridView)中

3
我有一个 datagridview,其中填充的数据来自一个 .xml 文件。这些数据是 MyObjects 列表,其中 MyObject 是我定义的一个 C# 类。最初没有使用模式文件,因此没有类型信息 :( 这意味着我无法从 MyObject 类中自动生成复选框列等东西。
所以,我使用 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验证为模式。 - tsul
1个回答

6

将其作为嵌入式强类型资源。

将文件添加到您的项目中,并将其生成操作设置为“内容”,并设置“不复制”。然后打开资源设计器选项卡(可以从属性文件夹或项目属性对话框中打开),并将文件拖放到资源设计器画布上。该文件现在已嵌入到您的程序集中。这将产生一个默认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` 模式。即使这正是你想要的,最好也明确说明。

我发现即使在调用readxml()之前调用readschema(),XmlReadMode.IgnoreSchema似乎也不起作用。这似乎是使用我的或您上面的代码时的情况。任何在xml文件中但未在模式文件中列出的元素都会被静默地添加到数据集中。 - Canacourse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接