Загрузить XML-схему и данные в DataSet (и datagridview) - PullRequest
3 голосов
/ 18 октября 2011

У меня есть сетка данных, заполненная данными из XML-файла.Данные - это список MyObjects, где MyObject - это класс C #, который у меня есть.Первоначально это было сделано без схемы, поэтому нет информации о типе :( Означает, что я не получаю преимущества автоматически генерируемых столбцов флажков для bools и т. Д. В классе 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";

Я уверен, что есть лучший способ справиться с этим ... я могу включить его как часть сборки или что-то? Спасибо за любую помощь.

1 Ответ

6 голосов
/ 18 октября 2011

Сделайте его встроенным строго типизированным ресурсом.

Добавьте файл в свой проект и задайте для него действие «Содержимое» и «Не копировать».Затем откройте вкладку «Дизайнер ресурсов» (либо из папки «Свойства», либо в диалоговом окне «Свойства проекта») и перетащите файл на холст дизайнера ресурсов.Файл теперь встроен в вашу сборку.Это создаст строго типизированное свойство класса 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, если есть встроенная схема, или *Режим 1030 *, если нет.Даже если это то, что вы хотите, лучше об этом сказать прямо.

...