【问题标题】:Load xml schema and data into DataSet (and datagridview)将 xml 模式和数据加载到 DataSet(和 datagridview)中
【发布时间】:2011-12-10 08:29:46
【问题描述】:

我有一个数据网格视图,其中填充了来自 .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。

标签: c# xml datagridview xsd schema


【解决方案1】:

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

将文件添加到您的项目中,并为其设置“内容”和“请勿复制”的构建操作。然后打开资源设计器选项卡(从属性文件夹或在项目属性对话框中)并将文件拖到资源设计器画布上。该文件现在嵌入到您的程序集中。这将生成默认 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 文件中但未在模式文件中列出的任何元素都会以静默方式添加到数据集中。
猜你喜欢
  • 1970-01-01
  • 2012-02-27
  • 1970-01-01
  • 2014-11-20
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 2014-06-16
相关资源
最近更新 更多