Загрузка xml-схемы и данных в DataSet (и datagridview)

#c# #xml #datagridview #xsd #schema

#c# #xml #datagridview #xsd #схема

Вопрос:

У меня есть datagridview, заполненный данными из 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. Сначала следует прочитать схему, чтобы проверить xml на соответствие схеме.

Ответ №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 mode, если есть встроенная схема, или InferSchema mode, если ее нет. Даже если это то, что вы хотите, лучше четко указать это.

Комментарии:

1. Я нашел XmlReadMode. IgnoreSchema, похоже, не работает, даже если вы вызываете readschema() перед readxml() . Похоже, что это так, используя мой собственный или ваш код выше. Любые элементы, которые находятся в файле xml, но не перечислены в файле схемы, автоматически добавляются в набор данных.