Carregando informações de esquema de conjunto de dados a partir de XML

O esquema de um DataSet (suas tabelas, colunas, relações e restrições) pode ser definido programaticamente, criado pelos métodos Fill ou FillSchema de um DataAdapter, ou carregado a partir de um documento XML. Para carregar informações de esquema DataSet de um documento XML, você pode usar o método ReadXmlSchema ou InferXmlSchema do DataSet. ReadXmlSchema permite carregar ou inferir informações de esquema DataSet do documento que contém esquema XSD (linguagem de definição de esquema XML) ou um documento XML com esquema XML embutido. InferXmlSchema permite inferir o esquema do documento XML enquanto ignora determinados namespaces XML que você especifica.

Nota

A ordenação de tabelas em um DataSet pode não ser preservada quando você usa serviços da Web ou serialização XML para transferir um DataSet que foi criado na memória usando construções XSD (como relações aninhadas). Portanto, o destinatário do DataSet não deve depender da ordenação da tabela neste caso. No entanto, a ordenação de tabelas é sempre preservada se o esquema do DataSet que está sendo transferido foi lido de arquivos XSD, em vez de ser criado na memória.

ReadXmlSchema

Para carregar o esquema de um DataSet de um documento XML sem carregar nenhum dado, você pode usar o método ReadXmlSchema do DataSet. ReadXmlSchema cria o esquema DataSet definido usando o esquema XSD (XML Schema Definition Language).

O método ReadXmlSchema usa um único argumento de um nome de arquivo, um fluxo ou um XmlReader contendo o documento XML a ser carregado. O documento XML pode conter apenas esquema ou pode conter esquema alinhado com elementos XML contendo dados. Para obter detalhes sobre como escrever esquema embutido como esquema XML, consulte Derivando a estrutura relacional do conjunto de dados do esquema XML (XSD).

Se o documento XML passado para ReadXmlSchema não contiver informações de esquema embutido, ReadXmlSchema inferirá o esquema a partir dos elementos no documento XML. Se o DataSet já contiver um esquema, o esquema atual será estendido adicionando novas tabelas se elas ainda não existirem. Novas colunas não serão adicionadas às tabelas existentes. Se uma coluna que está sendo adicionada já existir no DataSet , mas tiver um tipo incompatível com a coluna encontrada no XML, uma exceção será lançada. Para obter detalhes sobre como ReadXmlSchema infere um esquema de um documento XML, consulte Inferring DataSet Relational Structure from XML.

Embora ReadXmlSchema carregue ou infera apenas o esquema de um DataSet, o método ReadXml do DataSet carrega ou infere o esquema e os dados contidos no documento XML. Para obter mais informações, consulte Carregando um DataSet a partir de XML.

Os exemplos de código a seguir mostram como carregar um esquema DataSet de um documento XML ou fluxo. O primeiro exemplo mostra um nome de arquivo de esquema XML sendo passado para o método ReadXmlSchema . O segundo exemplo mostra um 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

Você também pode instruir o DataSet para inferir seu esquema de um documento XML usando o método InferXmlSchema do DataSet. InferXmlSchema funciona da mesma forma que ReadXml com um XmlReadMode de InferSchema (carrega dados e infere esquema) e ReadXmlSchema se o documento que está sendo lido não contiver nenhum esquema embutido. No entanto, InferXmlSchema fornece a capacidade adicional de permitir que você especifique namespaces XML específicos a serem ignorados quando o esquema é inferido. InferXmlSchema usa dois argumentos necessários: o local do documento XML, especificado por um nome de arquivo, um fluxo ou um XmlReader, e uma matriz de cadeia de caracteres de namespaces XML a serem ignorados pela operação.

Por exemplo, considere o seguinte 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>  

Devido aos atributos especificados para os elementos no documento XML anterior, o método ReadXmlSchema e o método ReadXml com um XmlReadMode de InferSchema criariam tabelas para cada elemento no documento: Categories, CategoryID, CategoryName, Description, Products, ProductID, ReorderLevel e Discontinued. (Para obter mais informações, consulte Inferindo a estrutura relacional do conjunto de dados a partir do XML.) No entanto, uma estrutura mais apropriada seria criar apenas as tabelas Categorias e Produtos e, em seguida, criar colunas CategoryID, CategoryName e Description na tabela Categorias e colunas ProductID, ReorderLevel e Discontinued na tabela Products . Para garantir que o esquema inferido ignore os atributos especificados nos elementos XML, use o método InferXmlSchema e especifique o namespace XML para officedata a ser ignorado, conforme mostrado no exemplo a seguir.

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");  

Consulte também