Carregando informações do esquema de DataSet do 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 ser carregado de um documento XML. Para carregar informações do esquema de DataSet de um documento XML, você pode usar o método ReadXmlSchema ou InferXmlSchema do DataSet. O ReadXmlSchema permite que você carregue ou deduza informações do esquema de DataSet do documento que contém o esquema da linguagem de definição de esquema XML (XSD) ou um documento XML com esquema XML embutido. O InferXmlSchema permite que você deduza o esquema do documento XML ignorando determinados namespaces de XML que você especificar.

Observação

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

ReadXmlSchema

Para carregar o esquema de um DataSet de um documento XML sem carregar dados, você poderá usar o método ReadXmlSchema do DataSet. O ReadXmlSchema cria o esquema do DataSet definido usando o esquema da linguagem de definição de esquema XML (XSD).

O método ReadXmlSchema aceita um argumento único de um nome de arquivo, um fluxo ou um XmlReader que contém o documento XML a ser carregado. O documento XML pode conter somente o esquema ou pode conter o esquema embutido com elementos XML que contêm dados. Para obter detalhes sobre como escrever esquema embutido como o esquema XML, consulte Derivar a estrutura relacional do DataSet do esquema XML (XSD).

Se o documento XML passado para o ReadXmlSchema não contiver nenhuma informação do esquema embutida, o ReadXmlSchema deduzirá o esquema 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. As 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á gerada. Para ver detalhes sobre como o ReadXmlSchema deduz um esquema de um documento XML, confira Como inferir a estrutura relacional do DataSet do XML.

Embora o ReadXmlSchema carregue ou deduza somente o esquema de um DataSet, o método ReadXml do DataSet carrega ou deduz o esquema e os dados contidos no documento XML. Para obter mais informações, consulte Carregar um conjunto de dados do XML.

Os seguintes exemplos de código mostram como carregar um esquema de DataSet de um documento ou fluxo de XML. O primeiro exemplo mostra um nome de arquivo de esquema XML que está 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 deduzir o esquema de um documento XML usando o método InferXmlSchema do DataSet. O InferXmlSchema funciona da mesma maneira que o ReadXml com um XmlReadMode de InferSchema (carrega os dados e também deduz o esquema) e ReadXmlSchema se o documento que está sendo lido não contiver nenhum esquema embutido. No entanto, o InferXmlSchema fornece o recurso adicional de permitir especificar namespaces específicos de XML a serem ignorados quando o esquema for deduzido. O InferXmlSchema utiliza dois argumentos necessários: o local do documento XML, especificado por um nome de arquivo, um fluxo ou um XmlReader; e uma matriz de cadeias de caracteres de namespaces de XML a ser ignorada 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, os métodos ReadXmlSchema e ReadXml com um XmlReadMode de InferSchema criariam tabelas para cada elemento no documento: Categories, CategoryID, CategoryName, Description, Products, ProductID, ReorderLevel e Discontinued. (Para mais informações, confira Deduzir a estrutura relacional do DataSet do XML.) No entanto, uma estrutura mais apropriada seria criar somente as tabelas Categories e Products e, em seguida, criar as colunas CategoryID, CategoryName e Description na tabela Categories e as colunas ProductID, ReorderLevel e Discontinued na tabela Products. Para garantir que o esquema deduzido ignore os atributos especificados nos elementos XML, use o método InferXmlSchema e especifique o namespace de XML para que o officedata seja 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");  

Confira também