Carregando um DataSet a partir de XML
O conteúdo de um DataSet ADO.NET pode ser criado 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 estrutura relacional do DataSet é criado.
Para preencher um DataSet com os dados do XML, use o método ReadXml do objeto DataSet. O método ReadXml faz a leitura de um arquivo, de um fluxo ou de um XmlReader e usa como argumentos a fonte do XML mais um argumento XmlReadMode opcional. Para obter mais informações sobre o XmlReader, confira Como ler dados XML com o XmlTextReader. O método ReadXml lê o conteúdo do fluxo ou do documento XML e carrega o DataSet com os dados. Também criará o esquema relacional do DataSet dependendo do XmlReadMode especificado e se um esquema relacional já existir.
A tabela a seguir descreve as opções para o argumento XmlReadMode.
Opção | Descrição |
---|---|
Auto | Esse é o padrão. Examina o XML e escolhe a opção mais apropriada na seguinte ordem: – Se o XML for um DiffGram, DiffGram será usado. – Se o DataSet contiver um esquema ou o XML contiver um esquema embutido, ReadSchema será usado. – Se o DataSet não contiver um esquema e o XML não contiver um esquema embutido, InferSchema será usado. Se você souber o formato XML que está sendo lido, para obter o melhor desempenho, será recomendável definir um XmlReadMode explícito, em vez de aceitar a opção Automático padrão. |
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 para o esquema existente no DataSet. Se qualquer tabela no esquema embutido já existir no DataSet, uma exceção será gerada. 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 nenhum esquema embutido, nenhum dado será lido. O esquema embutido pode ser definido usando o esquema da linguagem XSD. Para obter detalhes sobre como escrever o esquema embutido como o Esquema XML, confira Como derivar a estrutura relacional do DataSet do Esquema XML (XSD). |
IgnoreSchema | Ignora qualquer esquema embutido e carrega os dados no esquema DataSet existente. 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 terá a mesma funcionalidade que DiffGram . |
InferSchema | Ignora qualquer esquema embutido e infere o esquema pela estrutura dos dados XML, para então carregar os dados. Se o DataSet já contiver um esquema, o esquema atual será estendido adicionando colunas às tabelas existentes. As tabelas adicionais 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 qualquer coluna inferida estiver em conflito com colunas existentes. Para ver detalhes sobre como o ReadXmlSchema infere um esquema de um documento XML, confira Como inferir a estrutura relacional do DataSet por meio do XML. |
DiffGram | Lê um DiffGram e adiciona os dados no esquema atual. O DiffGram mescla as novas linhas com as linhas existentes quando os valores do identificador exclusivo correspondem. Consulte "Mesclando dados de XML” no final deste tópico. Para obter mais informações sobre DiffGrams, confira DiffGrams. |
Fragmento | Continua a ler múltiplos fragmentos XML até que o final do fluxo seja alcançado. Os fragmentos que corresponderem ao esquema DataSet são adicionados às tabelas apropriadas. Os fragmentos que não corresponderem ao esquema DataSet serão descartados. |
Observação
Se você transmitir um XmlReader para ReadXml que está posicionado parcialmente em um documento XML, o ReadXml lerá o próximo nó de elemento e o tratará como o elemento raiz, lendo somente até o final do nó do elemento. Isso não se aplicará se você especificar XmlReadMode.Fragment.
Entidades DTD
Se o XML contiver as entidades definidas em um esquema DTD (definição de tipo de documento), uma exceção será gerada se você tentar carregar um DataSet transmitindo um nome de arquivo, um fluxo ou um XmlReader sem validação para ReadXml. Em vez disso, você precisará criar um XmlValidatingReader, com EntityHandling definido como EntityHandling.ExpandEntities e transmitir o XmlValidatingReader para ReadXml. O XmlValidatingReader expandirá as entidades antes de ser lido pelo DataSet.
Os seguintes exemplos de código mostram como carregar um DataSet de um fluxo XML. O primeiro exemplo mostra um nome de arquivo que está sendo transmitido para o método ReadXml. O segundo exemplo mostra uma cadeia de caracteres que contém o XML que está sendo carregado usando um StringReader.
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);
Observação
Se você chamar ReadXml para carregar um arquivo muito grande, poderá observar um desempenho lento. Para garantir o melhor desempenho para ReadXml, em um arquivo grande, chame o método BeginLoadData para cada tabela no DataSet e chame ReadXml. 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();
Observação
Se o esquema XSD para o DataSet incluir um targetNamespace, os dados poderão não ser lidos e você poderá encontrar exceções ao chamar ReadXml para carregar o DataSet com um XML que contenha os elementos sem nenhum namespace qualificado. Para ler os elementos não qualificados nesse caso, defina elementFormDefault igual a "qualificado" no 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 XML serão adicionados aos dados já presentes no DataSet. O ReadXml não mescla no DataSet nenhuma informação de linha com as chaves primárias correspondentes por meio do XML. Para substituir as informações de linha existentes por novas informações do XML, use o ReadXml para criar um DataSet e depois Merge o novo DataSet no DataSet existente. Observe que o carregamento de um DiffGram usando ReadXML com um XmlReadMode de DiffGram mesclará as linhas que tiverem o mesmo identificador exclusivo.