Загрузка сведений о схеме набора данных из XML

Схема DataSet (ее таблицы, столбцы, связи и ограничения) может быть определена программным способом, создается методами Fill или FillSchema объекта DataAdapterили загружается из XML-документа. Чтобы загрузить сведения о схеме DataSet из XML-документа, можно использовать метод ReadXmlSchema или InferXmlSchema набора данных. ReadXmlSchema позволяет загружать или выводить сведения о схеме DataSet из документа, содержащего схему языка определения XML-схемы (XSD), или XML-документ с встроенной схемой XML. InferXmlSchema позволяет выводить схему из XML-документа, игнорируя определенные заданные пространства имен XML.

Примечание.

Порядок таблиц в наборе данных может не сохраняться при использовании веб-служб или xml-сериализации для передачи набора данных , созданного в памяти с помощью конструкций XSD (например, вложенных связей). Таким образом, получатель набора данных не должен зависеть от порядка таблиц в данном случае. Однако порядок таблиц всегда сохраняется, если схема передаваемых наборов данных была считывалась из XSD-файлов, а не создавалась в памяти.

ReadXmlSchema

Чтобы загрузить схему набора данных из XML-документа без загрузки данных, можно использовать метод ReadXmlSchema набора данных. ReadXmlSchema создает схему DataSet , определенную с помощью схемы XSD.

Метод ReadXmlSchema принимает один аргумент имени файла, потока или XmlReader , содержащего XML-документ для загрузки. XML-документ может содержать либо только схему, либо схему со встроенными XML-элементами, содержащими данные. Дополнительные сведения о написании встроенной схемы в виде XML-схемы см. в разделе "Вывод реляционной структуры набора данных" из схемы XML (XSD).

Если XML-документ, переданный в ReadXmlSchema, не содержит встроенных сведений о схеме, ReadXmlSchema выдаст схему из элементов в XML-документе. Если набор данных уже содержит схему, текущая схема будет расширена путем добавления новых таблиц, если они еще не существуют. Новые столбцы не будут добавляться к существующим таблицам. Если добавленный столбец уже существует в Наборе данных, но имеет несовместимый тип со столбцом, найденным в XML, создается исключение. Дополнительные сведения о том, как ReadXmlSchema определяет схему из XML-документа, см. в разделе Inferring DataSet Relational Structure from XML.

Хотя ReadXmlSchema загружает или выводит только схему набора данных, метод ReadXml набора данных загружает или определяет схему и данные, содержащиеся в XML-документе. Дополнительные сведения см. в разделе "Загрузка набора данных из XML".

В следующих примерах кода показано, как загрузить схему Набора данных из XML-документа или потока. В первом примере показано имя файла схемы XML, передаваемого методу ReadXmlSchema . Во втором примере показан System.IO.StreamReader.

Dim dataSet As DataSet = New DataSet  
dataSet.ReadXmlSchema("schema.xsd")  
DataSet dataSet = new DataSet();  
dataSet.ReadXmlSchema("schema.xsd");  
Dim xmlStream As New System.IO.StreamReader("schema.xsd")
Dim dataSet As DataSet = New DataSet  
dataSet.ReadXmlSchema(xmlStream)  
xmlStream.Close()  
System.IO.StreamReader xmlStream = new System.IO.StreamReader("schema.xsd");  
DataSet dataSet = new DataSet();  
dataSet.ReadXmlSchema(xmlStream);  
xmlStream.Close();  

InferXmlSchema

Вы также можете указать Набору данных выводить схему из XML-документа с помощью метода InferXmlSchema набора данных. InferXmlSchema работает так же, как и ReadXml с XmlReadModeinferSchema (загружает данные, а также схему инфификатора), и ReadXmlSchema, если документ, который читается, не содержит встроенной схемы. Однако InferXmlSchema предоставляет дополнительные возможности, позволяющие указать определенные пространства имен XML, которые следует игнорировать при выводе схемы. InferXmlSchema принимает два обязательных аргумента: расположение XML-документа, указанное именем файла, потоком или XmlReader; и строковым массивом пространств имен XML, которые будут игнорироваться операцией.

Например, рассмотрим следующий XML-код:

<NewDataSet xmlns:od="urn:schemas-microsoft-com:officedata">  
<Categories>  
  <CategoryID od:adotype="3">1</CategoryID>
  <CategoryName od:maxLength="15" od:adotype="130">Beverages</CategoryName>
  <Description od:adotype="203">Soft drinks and teas</Description>
</Categories>  
<Products>  
  <ProductID od:adotype="20">1</ProductID>
  <ReorderLevel od:adotype="3">10</ReorderLevel>
  <Discontinued od:adotype="11">0</Discontinued>
</Products>  
</NewDataSet>  

Из-за атрибутов, указанных для элементов в предыдущем XML-документе, метод ReadXmlSchema и метод ReadXml с xmlReadModeinferSchema создаст таблицы для каждого элемента документа: Categories, CategoryID, CategoryName, Description, Products, ProductID, ReorderLevel и Прекращено. (Дополнительные сведения см. в разделе Вывод реляционной структуры набора данных из XML.) Однако более подходящая структура — создать только таблицы категорий и продуктов, а затем создать столбцы CategoryID, CategoryName и Description в таблице "Категории", а также "ProductID", ReorderLevel и "Прекращено" в таблице Products. Чтобы убедиться, что выводная схема игнорирует атрибуты, указанные в XML-элементах, используйте метод InferXmlSchema и укажите пространство имен XML для officedata , которое будет игнорироваться, как показано в следующем примере.

Dim dataSet As DataSet = New DataSet  
dataSet.InferXmlSchema("input_od.xml", New String() {"urn:schemas-microsoft-com:officedata"})  
DataSet dataSet = new DataSet();  
dataSet.InferXmlSchema("input_od.xml", new string[] "urn:schemas-microsoft-com:officedata");  

См. также