Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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 dados de XML, use o ReadXml método do DataSet objeto. O ReadXml método 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, confira Como ler dados XML com o XmlTextReader. O ReadXml método lê o conteúdo do fluxo XML ou do documento e carrega os DataSet dados. Ele também criará o esquema relacional de DataSet dependendo do XmlReadMode esquema especificado e se um esquema relacional já existe ou não.
A tabela a seguir descreve as opções para o XmlReadMode argumento.
| Opção | Descrição |
|---|---|
| Automático | 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 se 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á utilizado.Se você souber o formato do XML que está sendo lido, para melhor desempenho, é recomendável que você defina um XmlReadMode explícito, em vez de aceitar o Auto 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, |
| 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 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 no esquema atual.
DiffGram mescla novas linhas com linhas existentes em que os valores exclusivos do identificador 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ê passar um XmlReader para o ReadXml que está posicionado em parte do caminho em um documento XML, ReadXml lerá até o próximo nó de elemento e tratará esse como o elemento raiz, lendo apenas até o final do nó do elemento. Isso não se aplicará se você especificar XmlReadMode.Fragment.
Entidades DTD
Se o seu XML contiver entidades definidas em um esquema de definição de tipo de documento (DTD), uma exceção será lançada se você tentar carregá-lo no ReadXml passando um nome de arquivo, um fluxo ou um XmlReader não validante. Em vez disso, você deve criar um XmlValidatingReader, com o EntityHandling definido como EntityHandling.ExpandEntities, e passar o seu XmlValidatingReader para o método ReadXml.
XmlValidatingReader expandirá as entidades antes de ser lidas 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 sendo passado para o ReadXml método. 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á encontrar 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 seu 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 XML com 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 XML serão adicionados aos dados já presentes no DataSet.
ReadXml não mescla do XML para o DataSet quaisquer dados de linha com chaves primárias correspondentes. Para substituir informações de linha existentes com novas informações do XML, use ReadXml para criar um novo DataSet, e em seguida, insira 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.