Carregando um DataSet a partir de XML

O conteúdo de um ADO.NET DataSet pode ser criado a partir de um fluxo ou documento XML. Além disso, com o .NET Framework você tem grande flexibilidade sobre quais informações são carregadas do XML e como o esquema ou a estrutura relacional do DataSet é criado.

Para preencher um DataSet com dados de XML, use o método ReadXml do DataSet objeto. O método ReadXml lê de um arquivo, um fluxo ou um XmlReader e usa como argumentos a origem do XML mais um argumento opcional XmlReadMode . Para obter mais informações sobre o XmlReader, consulte Lendo dados XML com XmlTextReader. O método ReadXml lê o conteúdo do fluxo XML ou documento e carrega o DataSet com dados. Ele também criará o esquema relacional do dependendo do DataSetXmlReadMode especificado e se um esquema relacional já existe ou não.

A tabela a seguir descreve as opções para o argumento XmlReadMode .

Opção Description
Automático Esta é a predefinição. Examina o XML e escolhe a opção mais apropriada na seguinte ordem:

- Se o XML for um DiffGram, o DiffGram é usado.
- Se o DataSet contém um esquema ou o XML contém um esquema embutido, ReadSchema é usado.
- Se o DataSet não contém um esquema e o XML não contém um esquema embutido, InferSchema é usado.

Se você souber o formato do XML que está sendo lido, para obter o melhor desempenho, é recomendável definir um XmlReadMode explícito, em vez de aceitar o padrão automático.
ReadSchema Lê qualquer esquema embutido e carrega os dados e o esquema.

Se o DataSet já contiver um esquema, novas tabelas serão adicionadas do esquema embutido ao esquema existente no DataSet. Se alguma tabela no esquema embutido já existir no DataSet, uma exceção será lançada. Você não poderá modificar o esquema de uma tabela existente usando XmlReadMode.ReadSchema.

Se o DataSet não contiver um esquema e não houver um esquema embutido, nenhum dado será lido.

O esquema embutido pode ser definido usando o esquema XSD (XML Schema Definition Language). Para obter detalhes sobre como escrever esquema embutido como esquema XML, consulte Derivando a estrutura relacional do conjunto de dados do esquema XML (XSD).
IgnoreSchema Ignora qualquer esquema embutido e carrega os dados no esquema existente DataSet . Todos os dados que não corresponderem ao esquema existente serão descartados. Se nenhum esquema existir no DataSet, nenhum dado será carregado.

Se os dados forem um DiffGram, IgnoreSchema tem a mesma funcionalidade que DiffGram.
InferSchema Ignora qualquer esquema embutido e infere o esquema de acordo com a estrutura dos dados XML e, em seguida, carrega os dados.

Se o DataSet já contiver um esquema, o esquema atual será estendido adicionando colunas às tabelas existentes. Tabelas extras não serão adicionadas se não houver tabelas existentes. Uma exceção será lançada se uma tabela inferida já existir com um namespace diferente ou se alguma coluna inferida entrar em conflito com colunas existentes.

Para obter detalhes sobre como ReadXmlSchema infere um esquema de um documento XML, consulte Inferring DataSet Relational Structure from XML.
DiffGram Lê um DiffGram e adiciona os dados ao esquema atual. O DiffGram mescla novas linhas com linhas existentes onde os valores do identificador exclusivo correspondem. Consulte "Mesclando dados de XML" no final deste tópico. Para obter mais informações sobre DiffGrams, consulte DiffGrams.
Fragmento Continua lendo vários fragmentos XML até que o final do fluxo seja alcançado. Os fragmentos que correspondem ao DataSet esquema são anexados às tabelas apropriadas. Os fragmentos que não correspondem ao DataSet esquema são descartados.

Nota

Se você passar um XmlReader para ReadXml que está posicionado parte do caminho em um documento XML, ReadXml lerá para o próximo nó do elemento e tratará isso como o elemento raiz, lendo até o final do nó do elemento apenas. Isso não se aplica se você especificar XmlReadMode.Fragment.

Entidades DTD

Se o XML contiver entidades definidas em um esquema DTD (definição de tipo de documento), uma exceção será lançada se você tentar carregar um DataSet passando um nome de arquivo, fluxo ou XmlReader não validado para ReadXml. Em vez disso, você deve criar um XmlValidatingReader, com EntityHandling definido como EntityHandling.ExpandEntities, e passar seu XmlValidatingReader para ReadXml. O XmlValidatingReader expandirá as entidades antes de ser lido DataSetpelo .

Os exemplos de código a seguir mostram como carregar um DataSet de um fluxo XML. O primeiro exemplo mostra um nome de arquivo sendo passado para o método ReadXml . O segundo exemplo mostra uma cadeia de caracteres que contém XML sendo carregado usando um StringReaderarquivo .

Dim dataSet As DataSet = New DataSet  
dataSet.ReadXml("input.xml", XmlReadMode.ReadSchema)  
DataSet dataSet = new DataSet();  
dataSet.ReadXml("input.xml", XmlReadMode.ReadSchema);  
Dim dataSet As DataSet = New DataSet  
Dim dataTable As DataTable = New DataTable("table1")  
dataTable.Columns.Add("col1", Type.GetType("System.String"))  
dataSet.Tables.Add(dataTable)  
  
Dim xmlData As String = "<XmlDS><table1><col1>Value1</col1></table1><table1><col1>Value2</col1></table1></XmlDS>"  
  
Dim xmlSR As System.IO.StringReader = New System.IO.StringReader(xmlData)  
  
dataSet.ReadXml(xmlSR, XmlReadMode.IgnoreSchema)  
DataSet dataSet = new DataSet();  
DataTable dataTable = new DataTable("table1");  
dataTable.Columns.Add("col1", typeof(string));  
dataSet.Tables.Add(dataTable);  
  
string xmlData = "<XmlDS><table1><col1>Value1</col1></table1><table1><col1>Value2</col1></table1></XmlDS>";  
  
System.IO.StringReader xmlSR = new System.IO.StringReader(xmlData);  
  
dataSet.ReadXml(xmlSR, XmlReadMode.IgnoreSchema);  

Nota

Se você chamar ReadXml para carregar um arquivo muito grande, você pode encontrar um desempenho lento. Para garantir o melhor desempenho para ReadXml, em um arquivo grande, chame o BeginLoadData método para cada tabela no e, em seguida, chame DataSetReadXml. Finalmente, chame EndLoadData para cada tabela no DataSet, conforme mostrado no exemplo a seguir.

Dim dataTable As DataTable  
  
For Each dataTable In dataSet.Tables  
   dataTable.BeginLoadData()  
Next  
  
dataSet.ReadXml("file.xml")  
  
For Each dataTable in dataSet.Tables  
   dataTable.EndLoadData()  
Next  
foreach (DataTable dataTable in dataSet.Tables)  
   dataTable.BeginLoadData();  
  
dataSet.ReadXml("file.xml");
  
foreach (DataTable dataTable in dataSet.Tables)  
   dataTable.EndLoadData();  

Nota

Se o esquema XSD para você DataSet incluir um targetNamespace, os dados podem não ser lidos e você pode encontrar exceções ao chamar ReadXml para carregar o DataSet com XML que contém elementos sem namespace qualificado. Para ler elementos não qualificados nesse caso, defina elementFormDefault igual a "qualificado" em seu esquema XSD. Por exemplo:

<xsd:schema id="customDataSet"
  elementFormDefault="qualified"  
  targetNamespace="http://www.tempuri.org/customDataSet.xsd"
  xmlns="http://www.tempuri.org/customDataSet.xsd"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">  
</xsd:schema>  

Mesclando dados de XML

Se o DataSet já contiver dados, os novos dados do XML serão adicionados aos dados já presentes no DataSet. ReadXml não mescla do XML em DataSet qualquer informação de linha com chaves primárias correspondentes. Para substituir informações de linha existentes por novas informações de XML, use ReadXml para criar um novo DataSete, em seguida Merge , o novo DataSet no existente DataSet. Observe que carregar um DiffGram usando ReadXML com um XmlReadMode de DiffGram mesclará linhas que têm o mesmo identificador exclusivo.

Consulte também