Поделиться через


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

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

Замечание

Порядок таблиц в объекте DataSet может не сохраняться при использовании веб-служб или сериализации XML для передачи DataSet, созданного в памяти с использованием конструкций XSD (например, вложенных отношений). Поэтому получатель DataSet не должен полагаться на порядок таблиц в этом случае. Однако порядок таблиц всегда сохраняется, если схема передаваемых DataSet файлов была считывалась из XSD-файлов, а не создавалась в памяти.

ReadXmlSchema

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

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

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

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

В следующих примерах кода показано, как загрузить схему DataSet из 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

Вы также можете направить DataSet, чтобы он определил свою схему из XML-документа с помощью метода InferXmlSchemaDataSet. InferXmlSchema функции совпадают с ReadXml и XmlReadMode в {InferSchema} (загружает данные и выводит схему), и 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 и Discontinued. (Дополнительные сведения см. в разделе "Вывод реляционной структуры набора данных" из XML.) Однако более подходящая структура будет создавать только Categories таблицы и Products таблицы, а затем создавать categoryID, CategoryName и Description столбцы в Categories таблице, а также ProductID, ReorderLevel и Discontinued столбцы в 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");

См. также